Spring Boot国际化i18n配置指南
一、配置
1、yml文件配置
spring:messages:basename: i18n/Messages,i18n/Messages_en_US,i18n/Messages_zh_CNencoding: 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
dd.test1=hello
dd.test2=hello {0}
Messages_en_US.properties
dd.test1=你好
dd.test2=你好 {0}
Messages.properties
里面的参数可不填写
二、Code
1、国际化工具类
代码说明:
-
使用单例模式反射调用,兼容工具类中语言国际化
-
LANGUAGE_CACHE:用来缓存当前环境使用语言类型,当页面下发切换语言接口时,将语言类型放入缓存中,每次调用国际化工具类时判断当前处于什么类型的语言环境中,此种方法可省略每个接口中下发 header
-
默认语言从本地获取,项目启动后未切换语言时
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 层
@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());}}
返回参数
{"code": "200","data": {"zh": "你好","en": "hello","zhParam": "你好 老王","enParam": "hello old wang"},"isOk": true
}
2.3、切换语言接口
@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());}}