SpringBoot国际化实现实战,实现语言的自由切换
zhezhongyun 2024-12-29 07:15 97 浏览
国际化是每个大型公司官网或者技术文档都会有的,比如前端UI库element、阿里云等,本节我们利用thymeleaf来实现国际化操作。
青锋开源项目地址
Gitee: https://gitee.com/msxy/qingfeng
关注青锋:获得更多技术支持和开源资料
1.1 新建项目
为了方便后续阅读我们新建模块fw-springboot-international,基本的SpringBoot+thymeleaf+国际化信息(message.properties)项目
1.2 maven配置
添加thymeleaf依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>com.yisu.cloud</groupId>
<artifactId>fw-cloud-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
1.3 国际化配置
设置了一个localeResolver,可以采用Cookie来控制国际化的语言,也可以采用Session来控制,两个启用一个即可。还设置一个LocaleChangeInterceptor拦截器来拦截国际化语言的变化,并且将拦截器加入到Spring中。
/**
* 配置信息
* @Author xuyisu
* @Date 2019/12/6
*/
@Configuration
public class I18nConfig extends WebMvcConfigurationSupport {
/**
* session区域解析器
* @return
*/
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver resolver = new SessionLocaleResolver();
resolver.setDefaultLocale(Locale.CHINA);
return resolver;
}
/**
* cookie区域解析器
* @return
*/
// @Bean
// public LocaleResolver localeResolver() {
// CookieLocaleResolver slr = new CookieLocaleResolver();
// //设置默认区域,
// slr.setDefaultLocale(Locale.CHINA);
// slr.setCookieMaxAge(3600);//设置cookie有效期.
// return slr;
// }
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
// 设置请求地址的参数,默认为:locale
// lci.setParamName(LocaleChangeInterceptor.DEFAULT_PARAM_NAME);
return lci;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
}
1.4 控制层
对于使用thymeleaf的我们可以直接跳转到页面,使用方式和JSP类似。这里我们设置默认页面就是跳转到index.html
/**
* 首页
* @Author xuyisu
* @Date 2019/12/6
*/
@Controller
public class IndexController {
@GetMapping("/")
public String index() {
return "/index";
}
}
1.5 message 信息
中文zh_CN
login.userId=用户名
login.noUserId=请输入用户名
login.password=密码
login.noPassword=密码不能为空
login.login=登录
英文en_US
login.userId = Login ID
login.noUserId = Please enter the user ID
login.password = Password
login.noPassword = password can not be blank
login.login = Login
1.6 页面
模拟一个简单的表单登录
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
<title>SpringBoot-international</title>
</head>
<body>
<div>
<form th:align="center">
<label th:text="#{login.userId}">Username</label>
<input type="text" th:placeholder="#{login.noUserId}" required="" autofocus="">
<br>
<label th:text="#{login.password}">Password</label>
<input type="password" th:placeholder="#{login.noPassword}" required="">
<br>
<button type="submit" th:text="#{login.login}">Sign in</button>
</form>
</div>
</body>
</html>
1.7 应用启动并访问
浏览器输入http://localhost:8774/,可以看到如下表单,默认是中文的,所以他默认会去messages_zh_CN.properties中找,如果没有就会去messages.properties中找。
如果输入http://localhost:8774/?locale=en_US语言就会切到英文。同样的如果url后参数设置为locale=zh_CH,语言就会切到中文
1.8 前后端分离的情况
对于如果不是thymeleaf的环境,而是前后端分离的情况,可以使用如下方式,通过接口设置语言环境,默认中文,然后通过key 获取对应的value值。
/**
* 设置语言环境
* @Author xuyisu
* @Date 2019/12/6
*/
@RestController
public class LanguageController {
@Autowired
private MessageUtil messageUtil;
/**
* 设置语言
* @param request
* @param response
* @param lang
* @return
*/
@GetMapping("/setLang")
public FwResult getInfoByLang(HttpServletRequest request, HttpServletResponse response,
String lang){
LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
if("zh".equals(lang)){
localeResolver.setLocale(request, response, new Locale("zh", "CN"));
}else if("en".equals(lang)){
localeResolver.setLocale(request, response, new Locale("en", "US"));
}
return FwResult.okMsg("设置"+lang+"成功");
}
/**
* 根据key 获取内容
* @param key
* @return
*/
@GetMapping("/getValue")
public FwResult getValue(String key) {
String welcome = messageUtil.getMessage(key);
return FwResult.ok(welcome);
}
}
获取message 中的国际化配置信息,这里抽取成一个公共方法
@Component
public class MessageUtil {
@Resource
private MessageSource messageSource;
public String getMessage(String code) {
return getMessage(code, null);
}
/**
*
* @param code :对应messages配置的key.
* @param args : 数组参数.
* @return
*/
public String getMessage(String code, Object[] args){
return getMessage(code, args, "");
}
/**
*
* @param code :对应messages配置的key.
* @param args : 数组参数.
* @param defaultMessage : 没有设置key的时候的默认值.
* @return
*/
public String getMessage(String code,Object[] args,String defaultMessage){
//这里使用比较方便的方法,不依赖request.
Locale locale = LocaleContextHolder.getLocale();
return messageSource.getMessage(code, args, defaultMessage, locale);
}
}
1.9 启动应用测试
浏览器或Postman 输入localhost:8774/getValue?key=login.noUserId
修改语言环境localhost:8774/setLang?lang=en
浏览器或Postman 再次输入localhost:8774/getValue?key=login.noUserId
1.10 乱码处理
如果遇到国际化配置文件中存在乱码的情况可以按照下图将标记的部分勾选即可
相关推荐
- 不看必后悔!15个三星GoodLock隐藏小技巧~(上)
-
很多刚用三星手机的星粉们,一定对三星GoodLock这个宝藏App还不是很了解,今天就带大家一起详细去看看GoodLock这个大家族究竟有多少宝藏功能及成员呢?让我们一起来看看吧~由于Good...
- 惊魂幻象理智值监控WA!大字体+范围提示一目了然
-
一个WA助你轻松监控大幻象理智值,不再错过恢复时机这个WA用大字体实时同步我们的理智值下面的图标提示恢复宝珠的剩余次数上面的图标高亮则意味着我们在宝珠的恢复范围内我们可以将图标随意移动到适合自己观察的...
- 盘点十个超炫的jQuery插件(jquery插件是干什么的)
-
“DevExpress14.2新版发布会”即将推出。心动不如行动,赶快报名吧!我们期待与您相约。今天小编为大家搜罗了十个超酷的jQuery插件,这可以使你的网站界面更加友好。jQuery创造了令人难...
- Google官方梳理,Android 多返回栈技术详解
-
用户通过系统返回按钮导航回去的一组页面,在开发中被称为返回栈(backstack)。多返回栈即一堆"返回栈",对多返回栈的支持是在Navigation2.4.0-alpha0...
- 说三星手机系统不好用,因为没有玩明白三星,三星Diy功能超强大
-
都说三星手机系统不好用,其实真正用起来,挺好用的三星手机系统像块没打磨的玉,默认设置是基础款,用着普通。但你要是肯花点时间,它能变得特别顺手。关键就在一个叫GoodLock的工具,它是三星自家出的...
- Sam Helper三星手机用户必装神器(三星手机必装app)
-
SamHelper这款软件集合了三星手机主题工具当前主题o主题路径o主题安装系统设置屏幕模式o状态栏o文件o频段o暗码Lock&LabsGoodLockoGalaxyLa...
- 外卖套餐搭配的探索和应用(外卖套餐搭配技巧)
-
本文系外卖美食知识图谱系列的第三篇文章,从技术层面我们会介绍外卖套餐搭配的技术方案,包括离线、实时的套餐搭配的迭代,套餐质量评估方案,同时会介绍套餐搭配的业务应用。1.背景让用户更方便快捷地选购到满...
- 用几行原生JS就可以实现丝滑的元素过渡效果
-
作者:ConardLi大家可以看下下面这个应用的页面切换体验,是不是很丝滑~做过体验优化的朋友应该都清楚,如果用原生的CSS或者JS动画去实现,想要实现出类似的效果,不会特别简单,而且也要考...
- 速腾车主RNS315固件及2016年6月地图升级详细教程
-
本来打算买个大众原厂的地图卡,后来在网上看其实不需要原厂地图卡也可以升级,于是开始在网上收集资料,开始天真的以为只要有密匙文件修改一下就可以免费升级了,其实最主要的还是破解的固件,不知道为什么,网上找...
- 学习一个母词act,一次解析一串关联、复合、衍生词族
-
首先形义解读一下act的原始意象,A是力量与行动的开始C是范围的覆盖T是目标目的的接触与刻度合在一起,行动行为艺术力量的复合行为以下是关于act的复合词、词根词缀衍生词及其变形后的词根衍生词的详细...
- 优迈系统(一体化控制柜)快车调试(八)
-
逻辑故障和驱动故障分析段码管上显示警告码和故障码对照表警告码操作模式故障码操作模式或驱动故障AL000EPC(紧急电源管制模式)ER100DTC(门在设定时间内不能关到位)AL001COR(复位模式)...
- Layui简单实现左侧菜单和Tab选项卡动态操作
-
<!DOCTYPEhtml><html><head><metacharset="utf-8">...
- 码农如何快速打造一个有设计感的网站
-
像我这样的程序员来说经常被“设计”这个词吓到,因为我是一名程序员而不是设计师,我拥有的是计算机学位证,另外我对ComicSans字体并不介意。(注:ComicSans字体是Win95附带...
- vue3 新特性 computed、watch、watchEffect 看完就会
-
1、watchEffectwatchEffect侦听器是一个副作用函数,不需要指定监听的某个属性,监视的回调中用到哪个属性,就会监听哪个属性,一旦运行就会立即执行。watchEffect与com...
- 10个冷门但非常实用前端开发者很少用的CSS规则
-
许多开发者只学了基础——比如修改颜色、设置字体或创建弹性布局——就止步不前。但CSS是一门精深而多用途的语言,掌握后能帮你构建优雅、高效且无障碍的界面。无论你是从零搭建还是微调设计系统,掌握一些高...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 教程 (33)
- HTML 简介 (35)
- HTML 实例/测验 (32)
- HTML 测验 (32)
- JavaScript 和 HTML DOM 参考手册 (32)
- HTML 拓展阅读 (30)
- HTML常用标签 (29)
- HTML文本框样式 (31)
- HTML滚动条样式 (34)
- HTML5 浏览器支持 (33)
- HTML5 新元素 (33)
- HTML5 WebSocket (30)
- HTML5 代码规范 (32)
- HTML5 标签 (717)
- HTML5 标签 (已废弃) (75)
- HTML5电子书 (32)
- HTML5开发工具 (34)
- HTML5小游戏源码 (34)
- HTML5模板下载 (30)
- HTTP 状态消息 (33)
- HTTP 方法:GET 对比 POST (33)
- 键盘快捷键 (35)
- 标签 (226)
- HTML button formtarget 属性 (30)
- CSS 水平对齐 (Horizontal Align) (30)