Java同步和异步过程中消息语言国际化处理策略

  在Java后端做消息内容的语言国际化处理时可以通过Spring中MessageSource接口的来实现,但是MessageSource接口需要用到Locale对象, 而Locale类又是根据前端传过来的语言类型来生成本地化的Locale对象的;因此,我们可以通过请求头中的某个字段来表明语言类别,例如:X-Lang-Id;这样的话,在前端调用后端接口时可以在请求头中设置X-Lang-Id的值即可,例如:zh_CH或者en_US,即X-Lang-Id:"zh_CH"或X-Lang-Id:"en_US";最后,我们还要在resources资源目录下分别创建语言对应的资源配置文件,例如:messages_en_US.properties和messages_zh_CH.properties,在这两个文件中添加相应的词条信息,如下图所示:

 

  下面将详细说明一下这种语言国际化处理流程,不管是同步过程还是异步过程,其本质是一样的,都需要更改Locale对象。

  (一)前后端协商通过在请求头中添加X-Lang-Id字段来表明语言类型

  (二)在Controller层获取前端传输过来的语言类型

  1、通过HttpHeaders对象来获取语言类型:

String langIdByHttpHeaders = httpHeaders.getFirst("X-Lang-Id");

  2、通过HttpServletResponse对象来获取语言类型:

String langIdByHttpServletRequest = request.getHeader("X-Lang-Id");

  为了简化流程试验,在Controller层接口的参数中同时添加HttpHeaders和HttpServletResponse,如下图所示:

  输入内容如下图所示:

  从上图可知,可以任性选择那种方式进行获取,目前的语言类型是en_US。

  (三)在Service层Locale对象处理

  1、添加MessageSource类型的成员变量,通过注解来实现,如下图所示:

  2、试验的逻辑代码如下

    @Override
    @Async
    public void testLang(String langId) {
        System.out.println("the current language is " + langId);
        Locale loc;
        if (!StringUtils.isEmpty(langId)) {
            String[] lanCty = langId.split("_");
            if(lanCty.length == 2) {
                loc = new Locale(lanCty[0], lanCty[1]);
            } else {
                loc = new Locale(lanCty[0]);
            }
        } else {
            loc = new Locale("en", "US"); // 提供默认语言
        }
        String testLang = this.messageSource.getMessage("Test.Lang", (Object[])null, loc); // “Test.Lang”是资源配置文件中的词条
        System.out.println("the current message is " + testLang); 
    }

  3、效果如下:

 

   4、延伸

  若你的工程本身支持了语言国际化处理流程,那么在异步的接口中调用Locale.setDefault(loc)方法即可,同步的接口就不要添加了,因为本身就支持了。

   (四)国际化提示语获取的方式

  • 通过注入的方式
@Autowired
LocaleMessageSourceBean lms;
  • 通过工具类获取bean示例
LocaleMessageSourceBean lms=(LocaleMessageSourceBean)SpringContextUtil.getBean("localeResolver");
posted @ 2020-01-17 11:34  晒太阳的兔子很忙  阅读(448)  评论(0编辑  收藏  举报