package net.watermelon.demo.vo; import java.text.MessageFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import org.springframework.context.ResourceLoaderAware; import org.springframework.context.support.AbstractMessageSource; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.ResourceLoader; public class MessageResource extends AbstractMessageSource implements ResourceLoaderAware { @SuppressWarnings("unused") private ResourceLoader resourceLoader; /** * Map切分字符 */ protected final String MAP_SPLIT_CODE = "|"; private final Map<String, String> properties = new HashMap<String, String>(); public MessageResource() { reload(); } public void reload() { properties.clear(); properties.putAll(loadTexts()); } /** * * 描述:TODO * 查询数据 虚拟数据,可以从数据库读取信息,此处省略 * @return */ private List<Resource> getResource() { List<Resource> resources = new ArrayList<Resource>(); Resource re = new Resource(); Resource re1 = new Resource(); re.setResourceId(1); re.setName("common.name"); re.setText("name"); re.setLanguage("en"); resources.add(0, re); re1.setResourceId(2); re1.setName("common.name"); re1.setText("\u59D3\u540D"); re1.setLanguage("zh"); resources.add(1, re1); return resources; } /** * * 描述:TODO * 加载数据 * @return */ protected Map<String, String> loadTexts() { Map<String, String> mapResource = new HashMap<String, String>(); List<Resource> resources = this.getResource(); for (Resource item : resources) { String code = item.getName() + MAP_SPLIT_CODE + item.getLanguage(); mapResource.put(code, item.getText()); } return mapResource; } /** * * 描述:TODO * @param code * @param locale 本地化语言 * @return */ private String getText(String code, Locale locale) { String localeCode = locale.getLanguage(); String key = code + MAP_SPLIT_CODE + localeCode; String localeText = properties.get(key); String resourceText = code; if (localeText != null) { resourceText = localeText; } else { localeCode = Locale.ENGLISH.getLanguage(); key = code + MAP_SPLIT_CODE + localeCode; localeText = properties.get(key); if (localeText != null) { resourceText = localeText; } else { try { if (getParentMessageSource() != null) { resourceText = getParentMessageSource().getMessage( code, null, locale); } } catch (Exception e) { logger.error(e); } } } return resourceText; } public void setResourceLoader(ResourceLoader resourceLoader) { this.resourceLoader = (resourceLoader != null ? resourceLoader : new DefaultResourceLoader()); } @Override protected MessageFormat resolveCode(String code, Locale locale) { String msg = getText(code, locale); MessageFormat result = createMessageFormat(msg, locale); return result; } @Override protected String resolveCodeWithoutArguments(String code, Locale locale) { String result = getText(code, locale); return result; } }
?配置一个自定义的MessageResource 就可以
Bean 定义里面加如下代码
@Bean public ResourceBundleMessageSource propertiesMessageSource(){ ResourceBundleMessageSource rs = new ResourceBundleMessageSource(); rs.setBasenames("messages"); return rs; } @Bean public MessageSource messageSource(){ MessageResource mrs = new MessageResource(); mrs.setParentMessageSource(propertiesMessageSource()); return mrs; }
?
? 这里?setParentMessageSource 可以一样读取 properties 配置文件中的多语言处理,增加了数据库的多语言处理,管理和开发起来都比较方便。
?
?
原文:http://guanxi.iteye.com/blog/2306278