spring 为我们提供了根据Locale 通过code 获取国际化的操作,所以我们在此基础上进行国际化的项目应用
LocaleResolver MessageResouce首先配置一个LocaleResolver 用来根据环境解析 Locale
@Bean
public LocaleResolver localeResolver() {
// 通过浏览器头部的语言信息来进行多语言选择
AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
return localeResolver;
}
然后为了方便 我们自定义一个Holder,方便业务代码访问MessageRsource(注意,我说的业务代码是泛指与spring无关的代码)
@Bean
public MessageResource messageHolder(org.springframework.context.MessageSource messageSource) {
MessageResource messageHolder = new SpringMessageResource(messageSource);
MessageHolder.set(messageHolder);
return messageHolder;
}
public class MessageHolder {
private static MessageResource INSTANCE;
public static void set(MessageResource messageResource) {
INSTANCE = messageResource;
}
public static MessageResource get() {
return INSTANCE;
}
}
messageSource 的定义,这么做的原因方便我们依赖的jar管理自己的国际化文件。
try {
// Class> clazz = Class.forName("com.kaffatech.mocha.frame.application.ApplicationContextHolder");
// MESSAGE_SOURCE = (MessageSource) clazz.getMethod("getBean", Class.class).invoke(null, MessageSource.class);
MESSAGE_SOURCE = new ResourceBundleMessageSource();
ResourcePatternResolver resourcePatternResolver =
new PathMatchingResourcePatternResolver();
FILES =
resourcePatternResolver.getResources(ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + "i18n" + "**
private static final long serialVersionUID = 1L;
private Integer code;
private String codeString;
private String description;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getCodeString() {
return codeString;
}
public void setCodeString(String codeString) {
this.codeString = codeString;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
那么该如何进行两个对象之间的转化呢?
我们leader为我们封装了一个 mapping映射器,并实现了一些converter。我粘贴出几个对国际化有意义的converter。
public interface SmartTypeConverter{ D convert(D existingDest, S src, ClassdestClass, Class srcClass); }
public class EnumerableDictItemDtoConverter implements SmartTypeConverter{ @Override public DictionaryItemDto convert(DictionaryItemDto existingDest, Enumerable src, Class destClass, Class srcClass) { if (src != null) { // 在这里将枚举转化为国际化的对象 DictionaryItemDto dto = EnumUtils.toDictionaryItem(src); return dto; } return null; } }
public static DictionaryItemDto toDictionaryItem(Enumerable enumerable) {
DictionaryItemDto dto = new DictionaryItemDto();
dto.setCode(enumerable.getCode());
dto.setCodeString(enumerable.getCodeString());
MessageResource messageResource = MessageHolder.get();
if (messageResource == null) {
dto.setDescription(enumerable.getDescription());
} else {
StringEnumerable annotation = enumerable.getClass().getAnnotation(StringEnumerable.class);
String code = annotation == null ? enumerable.getCode() + "" : enumerable.getCodeString();
dto.setDescription(
//这里去获取国际化的内容
messageResource.getMessage(
enumerable.getClass().getSimpleName() + "_" + code,
null,
enumerable.getDescription()));
}
return dto;
}
后语
到此为止,我还想多说两句,如果我们本地有国际化的配置文件的话,我们是能过做到国际化的,但是为了我们方便我们与翻译部门交互,我们是建了一个项目,我们成为翻译平台,就是将我们需要翻译的枚举,根据simpleClassName_code 上传到翻译平台上去,翻译们去翻译平台进行翻译,之后我们将翻译拉去到本地,即可。
也就是需要两个项目,一个项目,扫描我们代码的枚举推送到翻译平台,并负责从翻译平台上拉去翻译过的文件,放到各个项目中去。一个项目负责与翻译们交互,并保存翻译到数据库中。



