在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");

最新文章

  1. css中的大小、定位、轮廓相关属性
  2. linux运维中的命令梳理(四)
  3. 关于报malformed or corrupted AST file: 'Unable to load module 的错~
  4. Cocos2d-x中__Array容器以及实例介绍
  5. JQuery 绑定事件时传递参数的实现方法
  6. Swift正在使用NSURLConnection异步下载同步(实例解析)
  7. HQL练习
  8. 第一章 Bootstrap简介
  9. hook
  10. 在Ubuntu 18.04 安装 MySQL 8.0
  11. jmeter之服务器性能监测
  12. WITH RECOMPILE和OPTION(RECOMPILE)区别
  13. VM浏览器不能访问
  14. Shell脚本高级编程笔记一
  15. 【zipkin】链路追踪
  16. 第32讲:List的基本操作实战与基于模式匹配的List排序算法实现
  17. PAT甲题题解-1067. Sort with Swap(0,*) (25)-贪心算法
  18. ORA-01591 锁定已被有问题的分配事务处理--解决方法(转)
  19. 分析Linux上的程序依赖
  20. Getting Started with Google Tango(Google Tango开始教程)

热门文章

  1. JS中map与forEach的区别
  2. 《Python学习手册 第五版》 -第2章 Python如何运行程序
  3. NR / 5G - Polar Coding
  4. java String hashCode遇到的坑
  5. 数据分析之pandas库--series对象
  6. android应用开发错误:Your project contains error(s),please fix them before running your
  7. 利用VS Code在Azure上构建部署静态页面
  8. GNU make doc - 6.6 追加变量值
  9. 显示层封装及实现与优化(无动画+css3动画+js动画)
  10. SQL查询结果自定义排序