当前位置: 首页 > news >正文

Spring Boot国际化i18n配置指南

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());}}

相关文章:

  • 华清远见嵌入式学习——ARM——作业3
  • 16.Redis 高级数据类型 + 网站数据统计
  • 关于“Python”的核心知识点整理大全34
  • 交通流预测 | Matlab基于KNN-BiLSTM的交通流预测(对比SVR、LSTM、GRU、KNN-LSTM)
  • 什么时候用多线程、为什么要设计多线程?
  • JVM高频面试题(2023最新版)
  • rocky linux9 安装go 即接下去
  • 单元测试实战
  • devops使用
  • 为实体服务器配置Ubuntu
  • 【IO】IO模型与零拷贝
  • html table+css实现可编辑表格
  • 理解SpringMVC的工作流程
  • 【宇宙猜想】AR文创入驻今日美术馆、北京天文馆等众多展馆,在AR互动中感受科技魅力!
  • 软件工程快速复习(期末急救)
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • C++类中的特殊成员函数
  • HomeBrew常规使用教程
  • learning koa2.x
  • mac修复ab及siege安装
  • MySQL几个简单SQL的优化
  • node 版本过低
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • Windows Containers 大冒险: 容器网络
  • 大整数乘法-表格法
  • 手写一个CommonJS打包工具(一)
  • 详解移动APP与web APP的区别
  • 数据库巡检项
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #AngularJS#$sce.trustAsResourceUrl
  • #stm32驱动外设模块总结w5500模块
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (二)windows配置JDK环境
  • (二开)Flink 修改源码拓展 SQL 语法
  • (四)Controller接口控制器详解(三)
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)视频码率,帧率和分辨率的联系与区别
  • *1 计算机基础和操作系统基础及几大协议
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • ./和../以及/和~之间的区别
  • .NET HttpWebRequest、WebClient、HttpClient
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .net流程开发平台的一些难点(1)
  • .net中我喜欢的两种验证码
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题
  • [2013][note]通过石墨烯调谐用于开关、传感的动态可重构Fano超——
  • [Android]Android开发入门之HelloWorld
  • [Android开源]EasySharedPreferences:优雅的进行SharedPreferences数据存储操作
  • [Avalon] Avalon中的Conditional Formatting.
  • [AX]AX2012开发新特性-禁止表或者表字段