SpringBoot实现i18n国际化配置(超详细之跟着走就会系列)
一、新增国际化资源文件
在resources文件下新建i18n文件,并新建国际化资源文件。如图:
点击新增Resource Bundle文件。
我们在Resource bundle base name处填写国际化文件的名称,笔者此处填“messages”。并点击中间偏右的“+”号,新增国际化语言,此处新增两个语言“zh_CN”,“en_US”。
点击ok保存,看到这样的文件结构,就表示创建成功了:
分别在两个文件中添加
zh_CN:
A00001=你好,世界
A00002=你好,JAVA
en_US:
A00001=Hello World
A00002=Hello JAVA
二、添加国际化配置
2.1 添加配置文件
spring:messages:basename: i18n/messages
注意:此处的basename填的messages是填Resource bundle base name时填的值。
2.2 添加配置类
MyLocaleResolver:
/*** @Description: 自定义LocaleResolver* @author Felix.Du* @Date: 2022/3/30 21:25*/
@Configuration
public class MyLocaleResolver implements LocaleResolver {@Autowiredprivate HttpServletRequest request;public Locale getLocal() {return resolveLocale(request);}/*** 从HttpServletRequest中获取Locale** @param httpServletRequest httpServletRequest* @return 语言Local*/@Overridepublic Locale resolveLocale(HttpServletRequest httpServletRequest) {//获取请求中的语言参数String language = httpServletRequest.getParameter("lang");//如果没有就使用默认的(根据主机的语言环境生成一个 LocaleLocale locale = Locale.getDefault();//如果请求的链接中携带了 国际化的参数if (!StringUtils.isEmpty(language)){//zh_CNString[] s = language.split(Constant.CONNECTOR);//国家,地区locale = new Locale(s[0], s[1]);}return locale;}/*** 用于实现Locale的切换。比如SessionLocaleResolver获取Locale的方式是从session中读取,但如果* 用户想要切换其展示的样式(由英文切换为中文),那么这里的setLocale()方法就提供了这样一种可能** @param request HttpServletRequest* @param httpServletResponse HttpServletResponse* @param locale locale*/@Overridepublic void setLocale(@NonNull HttpServletRequest request, @Nullable HttpServletResponse httpServletResponse, @Nullable Locale locale) {}
}
添加i18n工具类,I18nUtil:
@Slf4j
@Component
public class I18nUtil {@Value("${spring.messages.basename}")private String basename;private final MyLocaleResolver resolver;private static MyLocaleResolver customLocaleResolver;private static String path;public I18nUtil(MyLocaleResolver resolver) {this.resolver = resolver;}@PostConstructpublic void init() {setBasename(basename);setCustomLocaleResolver(resolver);}/*** 获取 国际化后内容信息** @param code 国际化key* @return 国际化后内容信息*/public static String getMessage(String code) {Locale locale = customLocaleResolver.getLocal();return getMessage(code, null, code, locale);}/*** 获取指定语言中的国际化信息,如果没有则走英文** @param code 国际化 key* @param lang 语言参数* @return 国际化后内容信息*/public static String getMessage(String code, String lang) {Locale locale;if (StringUtils.isEmpty(lang)) {locale = Locale.US;} else {try {var split = lang.split("-");locale = new Locale(split[0], split[1]);} catch (Exception e) {locale = Locale.US;}}return getMessage(code, null, code, locale);}/*** 获取站内信指定语言 目前只支持 中文与英文两类 默认英文** @param code 国际化 key* @param lang 语言参数* @return 国际化后内容信息*/public static String getStationLetterMessage(String code, String lang) {Locale locale = Objects.equals(lang, I18nConstant.ZH_CN) ? Locale.SIMPLIFIED_CHINESE : Locale.US;return getMessage(code, null, code, locale);}public static String getMessage(String code, Object[] args, String defaultMessage, Locale locale) {ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();messageSource.setDefaultEncoding(StandardCharsets.UTF_8.toString());messageSource.setBasename(path);String content;try {content = messageSource.getMessage(code, args, locale);} catch (Exception e) {log.error("国际化参数获取失败===>{},{}", e.getMessage(), e);content = defaultMessage;}return content;}public static void setBasename(String basename) {I18nUtil.path = basename;}public static void setCustomLocaleResolver(MyLocaleResolver resolver) {I18nUtil.customLocaleResolver = resolver;}}
三、测试
FirstUserController:
@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
@Slf4j
public class FirstUserController {private final HttpServletRequest request;@GetMapping("/i18n")public String i18n() {String message1 = I18nUtil.getMessage("A00001", request.getHeader("lang"));String message2 = I18nUtil.getMessage("A00002", request.getHeader("lang"));return message1 + message2;}
}
因为此处截取的是请求头的lang参数,那么我们在请求的时候添加一个lang参数。
注意:此处lang传的值是zh-CN、en-US并非zh_CN、en_US,因为在MyLocaleResolver中解析参数是通过分隔符“-”解析的,而并不是“”。当然你也可以传zh_CN、en_US,只需要在MyLocaleResolver类的resolveLocale方法将解析符号换为“”即可。
SpringBoot实现i18n国际化配置(超详细之跟着走就会系列)相关推荐
- SpringBoot 系列教程(四十六):SpringBoot集成i18n国际化配置
一.概述 软件的国际化:软件开发时,要使它能同时应对世界不同地区和国家的访问,并针对不同地区和国家的访问,提供相应的.符合来访者阅读习惯的页面或数据. 国际化(internationalization ...
- (转)Spring Boot 日志配置(超详细)
转自:https://blog.csdn.net/inke88/article/details/75007649 ============================== Spring Boot- ...
- Spring Boot 日志配置(超详细)
Spring Boot-日志配置(超详细) 更新日志: 20170810 更新通过 application.yml传递参数到 logback 中. 简书不支持目录,截图一张. 默认日志 Logback ...
- post修改服务器数据源,postgresql安装及配置超详细教程
1. 安装 根据业务需求选择版本,官网下载 初始化数据库 执行完初始化任务之后,postgresql 会自动创建和生成两个用户和一个数据库: linux 系统用户 postgres:管理数据库的系统用 ...
- MySQL8.0.22安装及配置(超详细)
MySQL8.0.22安装及配置(超详细) 大家好,今天我们来学习一下 MySQL8.0.22安装及配置,好好看,好好学,超详细的 第一步 进入MySQL官网下载,如下图所示: 第二步 进入下载完成后 ...
- maven安装及配置(超详细)
maven安装及配置(超详细) 大家好,今天我们来学习一下maven安装及配置,好好看,好好学,超详细的 第一步 进入maven官网下载,如下图所示: 第二步 下载好压缩包或解压到除了c盘任意一个盘, ...
- 静态路由基础,扩展配置 超详细滴
目录 一,负载均衡 二,环回接口 三,手工汇总 四,路由黑洞 五,缺省路由 六,空接口 七,浮动静态 一,负载均衡: 上下带宽不一致,不建议使用负载均衡.例如:网线的1000M和100m 所访问的目标 ...
- Spring进行 i18n国际化配置
(本项目是基于Dubbo的,所以会有后端服务和前端Controller两次国际化的配置) 对后端服务的异常代码进行国际化版本的配置 1.在provider的resources中新建一个properti ...
- jsp进行 i18n国际化配置
下面是对jsp进行国际化配置的步骤: 1.在resources中新建一个messages的文件夹,新建两个properties,内容如下: promptMessage_me_JD.properties ...
最新文章
- RocketMQ Summit 2022 案例征集中
- java静态内部类(嵌套类)
- 读取文本作为输出字段
- 情态 语态_情绪与情态与对话情感
- 《高性能javascript》随笔
- 链家广州二手房的数据与分析——爬取数据
- javascript判断一个数是否是素数(质数)
- 【分享】Gitee如何下载单个文件
- springboot框架下利用websocket实现即时通讯
- android 仿微信demo————微信发现界面实现
- 服务网关配置:Zuul
- libvirt零知识学习6 —— libvirt源码编译安装(4)
- 【转】 教你一眼认出英语单词的意思
- 加分项——C语言实现Linux的pwd命令
- java桌面程序与服务交互_Java作为具有交互式桌面支持的Windows服务并读取curren登录用户...
- 【Python】最全中文停用词表整理(1893个)()
- jQuery源码导航
- 第二章 表格及样式入门 ② 代码
- JAVA银企直连建设银行云直连模式超详细讲解
- MUCH:专跑Android游戏的国产PSP