栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

记当前项目中国际化的做法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

记当前项目中国际化的做法

记当前项目中国际化的做法

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, Class destClass, 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 上传到翻译平台上去,翻译们去翻译平台进行翻译,之后我们将翻译拉去到本地,即可。

也就是需要两个项目,一个项目,扫描我们代码的枚举推送到翻译平台,并负责从翻译平台上拉去翻译过的文件,放到各个项目中去。一个项目负责与翻译们交互,并保存翻译到数据库中。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/703617.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号