spring: messages: basename: i18n/Messages,i18n/Messages_en_US,i18n/Messages_zh_CN encoding: UTF-8
i18n:表示国际化文件的父目录
Messages:默认国际化文件
Messages_en_US:英文文件
Messages_zh_CN:中文文件
在 resources 目录下面创建 i18n 目录,接着创建3种资源包,名称为第一步 yml 文件中 spring.messages.basename i18n 后面的名称
添加完成如下所示
勾选自动转换成 Ascii 但显示原生的内容
此步骤防止在文件中显示乱码,如下面的情况
dd.test1=\u6D4B\u8BD5\u56FD\u9645\u5316 dd.test2=\u5E26\u53C2\u6570{0}\u6D4B{1}\u8BD5
Messages_en_US.properties
dd.test1=hello dd.test2=hello {0}
Messages_en_US.properties
dd.test1=你好 dd.test2=你好 {0}
Messages.properties
里面的参数可不填写
代码说明:
使用单例模式反射调用,兼容工具类中语言国际化
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 MapLANGUAGE_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; } }
@GetMapping("/testMsg") public ResultMsggetL() { 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 }
@PostMapping("/switch") public ResultMsgswitchLang(@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()); } }