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");
Java同步和异步过程中消息语言国际化处理策略的更多相关文章
- Java同步和异步,阻塞和非阻塞
同步和异步.阻塞和非阻塞 同步和异步关注的是消息通信机制. 同步是指: 发送方发出数据后, 等待接收方发回响应后才发下一个数据包的通讯方式. 就是在发出一个调用时, 在没有得到结果之前, 该调用就不返 ...
- Java同步与异步
一.关键字: thread(线程).thread-safe(线程安全).intercurrent(并发的) synchronized(同步的).asynchronized(异步的). volatile ...
- Java连接远程Mysql过程中遇到的各种问题
2018-11-16 10:46 2018-11-19 21:35 前言 本篇文章记录的是本人在使用Java程序连接另一台电脑(同一局域网)上的Mysql数据库的过程中遇到的各种问题及解决方案.希望能 ...
- Java同步、异步区别
一.概念: 1.同步:所有的操作都做完,才返回给用户.这样用户在线等待的时间太长,给用户一种卡死了的感觉(就是系统迁移中,点击了迁移,界面就不动了,但是程序还在执行,卡死了的感觉).这种情况下,用户不 ...
- java new一个对象的过程中发生了什么
java在new一个对象的时候,会先查看对象所属的类有没有被加载到内存,如果没有的话,就会先通过类的全限定名来加载.加载并初始化类完成后,再进行对象的创建工作. 我们先假设是第一次使用该类,这样的话n ...
- (转)Java new一个对象的过程中发生了什么
Java在new一个对象的时候,会先查看对象所属的类有没有被加载到内存,如果没有的话,就会先通过类的全限定名(包名+类名)来加载.加载并初始化类完成后,再进行对象的创建工作. 我们先假设是第一次使用该 ...
- java new一个对象的过程中发生了什么?
java在new一个对象的时候,会先查看对象所属的类有没有被加载到内存,如果没有的话,就会先通过类的全限定名来加载.加载并初始化类完成后,再进行对象的创建工作. 我们先假设是第一次使用该类,这样的话n ...
- Java面试题系列(三)Java new一个对象的过程中发生了什么
Person class Person{ private String name; private int age; public Person() { super(); } public Perso ...
- java基础:多态过程中的动态绑定
重刷java-core的chapter05,P158 重读多态,感觉又不一样了. 记录一下对象方法执行过程: 1. 编译器查看对象声明类型和方法名,如class.fuction(param),cla ...
随机推荐
- JAVA编程思想——分析阅读
需要源码.JDK1.6 .编码风格参考阿里java规约 7/12开始 有点意识到自己喜欢理论大而泛的模糊知识的学习,而不喜欢实践和细节的打磨,是因为粗心浮躁导致的么? cron表达式使用 设计能力.领 ...
- PC微信逆向--实现消息防撤回
自从聊天软件消息撤回功能问世后,对于撤回的消息,我们对它一直有种强烈的好奇感."Ta刚撤回了什么?是骂我的话?还是说喜欢我?还是把发给其他人的消息误发给了我?好气呀,都看不到了...&quo ...
- Java开发最佳实践(一) ——《Java开发手册》之"编程规约"
Java开发手册版本更新说明 专有名词解释 一. 编程规约 (一) 命名风格 (二) 常量定义 (三) 代码格式 (四) OOP 规约 (五) 集合处理 (六) 并发处理 (七) 控制语句 (八) 注 ...
- pytorch之 sava_reload_model
import torch import matplotlib.pyplot as plt # torch.manual_seed(1) # reproducible # fake data x = t ...
- k8s Pipline CI/CD
一.Pipeline介绍 pipeline是一套jenkins官方提供的插件,它可以用来在jenkins中实现和集成连续交付 用户可以利用Pipeline的许多功能: 代码:pipeline在代码中实 ...
- expect知识梳理
1 expect expect软件用于实现非交互式操作,实际应用中常用于批量部署,可以帮助运维人员管理成千上万台服务器. expect实现非交互式操作主要是在程序发出交互式询问时,按条件传递程序所需的 ...
- bootstrap-daterangepicker
1,依赖关系 使用之前需要引用bootstrap.css daterangpicker.css jquery.js boostrap.js moment.js daterangpi ...
- android编译/反编译常用工具及项目依赖关系
项目依赖关系 apktool:依赖smali/baksmali,XML部分 AXMLPrinter2 JEB:dx 工具依赖 AOSP , 反编译dex 依赖 apktool dex2jar:依赖 A ...
- Anaconda使用教程全攻略
Anaconda使用教程全攻略 本文转自 https://zhuanlan.zhihu.com/p/32925500 〇.序 Python是一种面向对象的解释型计算机程序设计语言, ...
- [PHP] 使用PHP在mongodb中进行嵌套查询
作为文档数据库,数据库中存储的数据是类似json的结构,比如{“modelInfo”:{"status":1,audited:"1"}},想要查询status是 ...