Spring Boot国际化i18n配置指南
一、配置
1、yml文件配置
yml
spring:
messages:
basename: i18n/Messages,i18n/Messages_en_US,i18n/Messages_zh_CN
encoding: UTF-8
i18n:表示国际化文件的父目录
Messages:默认国际化文件
Messages_en_US:英文文件
Messages_zh_CN:中文文件
2、idea 配置
2.1、创建i18n目录
在 resources
目录下面创建 i18n
目录,接着创建3种资源包,名称为第一步 yml 文件中 spring.messages.basename
i18n 后面的名称
添加完成如下所示
2.2、修改idea字符集
勾选自动转换成 Ascii 但显示原生的内容
此步骤防止在文件中显示乱码,如下面的情况
dd.test1=\u6D4B\u8BD5\u56FD\u9645\u5316
dd.test2=\u5E26\u53C2\u6570{0}\u6D4B{1}\u8BD5
3、填充参数
Messages_en_US.properties
properties
dd.test1=hello
dd.test2=hello {0}
Messages_en_US.properties
properties
dd.test1=你好
dd.test2=你好 {0}
Messages.properties
里面的参数可不填写
二、Code
1、国际化工具类
代码说明:
-
使用单例模式反射调用,兼容工具类中语言国际化
-
LANGUAGE_CACHE:用来缓存当前环境使用语言类型,当页面下发切换语言接口时,将语言类型放入缓存中,每次调用国际化工具类时判断当前处于什么类型的语言环境中,此种方法可省略每个接口中下发 header
-
默认语言从本地获取,项目启动后未切换语言时
java
package com.dstz.agilebpm.util;
import org.apache.commons.lang3.StringUtils;
import org.omg.PortableInterceptor.INACTIVE;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
/**
* @Author: Lisy
* @Description: 国际化工具类
*/
public class MessageUtil {
private MessageUtil() {
}
private static MessageUtil INSTANCE;
private static MessageSource messageSource;
private static Locale LOCALE;
public static final Map<String, Integer> LANGUAGE_CACHE = new HashMap<>(1);
public static MessageUtil getInstance() {
if (Objects.isNull(INSTANCE)) {
synchronized (MessageUtil.class) {
if (Objects.isNull(INSTANCE)) {
INSTANCE = new MessageUtil();
messageSource = ReflectUtil.getBean(MessageSource.class);
LOCALE = LocaleContextHolder.getLocale();
}
}
}
return INSTANCE;
}
/**
* 返回默认值,不带参数
*
* @param code
* @return
*/
public String getMessage(String code) {
return getMessage(code, "");
}
/**
* 消息中插入参数
*
* @param code key
* @param args 参数
* @return 转换值
*/
public String getMessage(String code, String... args) {
return messageSource.getMessage(code, args, getLocale());
}
/**
* 指定编码返回带参数值
*
* @param code key
* @param locale 编码
* @param args 参数
* @return 转换值
*/
public String getMessage(String code, Locale locale, String... args) {
return messageSource.getMessage(code, args, locale);
}
private Locale getLocale() {
Locale local;
Integer langType = LANGUAGE_CACHE.get("LangType");
if (Objects.isNull(langType)) {
local = LOCALE;
} else {
switch (langType) {
case 0:
local = new Locale("zh", "CN");
break;
case 1:
local = new Locale("en", "US");
break;
default:
local = LOCALE;
}
}
return local;
}
}
2、使用示例
2.1、controller 层
java
@GetMapping("/testMsg")
public ResultMsg<JSONObject> getL() {
try {
JSONObject result = new JSONObject();
MessageUtil messageUtil = MessageUtil.getInstance();
result.put("zh", messageUtil.getMessage("dd.test1", new Locale("zh", "CN")));
result.put("en", messageUtil.getMessage("dd.test1", new Locale("en", "US")));
result.put("zhParam", messageUtil.getMessage("dd.test2", new Locale("zh", "CN"), "老王"));
result.put("enParam", messageUtil.getMessage("dd.test2", new Locale("en", "US"), "old wang"));
return new ResultMsg<>(result);
} catch (Exception e) {
LOG.error(e.getMessage(), e);
return new ResultMsg<>(BaseStatusCode.SYSTEM_ERROR, e.getMessage());
}
}
返回参数
json
{
"code": "200",
"data": {
"zh": "你好",
"en": "hello",
"zhParam": "你好 老王",
"enParam": "hello old wang"
},
"isOk": true
}
2.3、切换语言接口
java
@PostMapping("/switch")
public ResultMsg<String> switchLang(@RequestParam Integer language) {
try {
MessageUtil.LANGUAGE_CACHE.clear();
MessageUtil.LANGUAGE_CACHE.put("LangType", language);
return new ResultMsg<>(BaseStatusCode.SUCCESS, "switch success");
} catch (Exception e) {
LOG.error(e.getMessage(), e);
return new ResultMsg<>(BaseStatusCode.SYSTEM_ERROR, e.getMessage());
}
}