springboot 使用i18n进行国际化
1、i18n介绍
i18n(其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数)是“国际化”的简称。在资讯领域,国际化(i18n)指让产品(出版物,软件,硬件等)无需做大的改变就能够适应不同的语言和地区的需要。对程序来说,在不修改内部代码的情况下,能根据不同语言及地区显示相应的界面。
2、页面元素国际化:
pom文件引入thymeleaf依赖:
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-thymeleaf</artifactId>
- </dependency>
新增一个html文件hello.html:
- <!DOCTYPE html>
- <html xmlns="http://www.w3.org/1999/xhtml"
- xmlns:th="http://www.thymeleaf.org"
- <head>
- <title>hello</title>
- </head>
- <body>
- <span>
- <label th:text="#{welcome}"></label>
- </span>
- </body>
- </html>
SpringBoot 默认支持国际化的,在resources/下定义国际化文件,名称必须以messages开头,因为 MessageSourceAutoConfiguration 类中指定了前缀。
- messages.properties
- welcome = 欢迎使用i18n(默认)
- messages_zh_CN.properties
- welcome = 欢迎使用i18n(中文)
- messages_en_US.properties
- welcome = welcome to use i18n(english)
访问接口
- @Controller
- public class HelloController {
- @RequestMapping(value = "hello")
- public String hello() {
- return "hello";
- }
- }
启动项目访问http://localhost:8080/hello就可以看到效果
3、修改默认messages配置前缀
上面使用的是messages默认的配置,即直接放在resources/目录下,一般项目中会使用自己的目录存放,如放在resources/i18n/目录下
在application配置中添加
- #i18n
- spring:
- messages:
- encoding: UTF-8
- basename: i18n/messages
加好之后重新访问即可
4、代码中使用国际化
- //注入 MessageSource 对象,通过 getMessage 方法获取信息
- @Autowired
- private MessageSource messageSource;
- //使用
- messageSource.getMessage("welcome", null, locale);
说明:第一个参数是国际化文件的key,第二个参数是key对应value中的占位符数据(如welcome=欢迎使用{0}中的{0}就是占位符,0表示是第一个,对应数据中的第一个值),第三个是当前区域
5、会话区域解析器SessionLocaleResolver
注入 Bean
- //注入 Bean,会话区域解析器只针对当前会话有效
- @Bean
- public LocaleResolver localeResolver() {
- SessionLocaleResolver slr = new SessionLocaleResolver();
- //设置默认区域,
- slr.setDefaultLocale(Locale.ENGLISH);
- return slr;
- }
接口控制器:
- @RequestMapping("/i18n")
- public String changeSessionLanauage(HttpServletRequest request, String lang){
- System.out.println(lang);
- if(CommonConsts.LANG_ZH.equals(lang)){
- //代码中即可通过以下方法进行语言设置
- request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,new Locale("zh","CN"));
- }else if(CommonConsts.LANG_EN.equals(lang)){
- request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,new Locale("en","US"));
- }
- return "redirect:/hello";
- }
其中request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,new Locale("zh","CN"));用于切换当前会话区域
前端页面hello.html修改:
- <!DOCTYPE html>
- <html xmlns="http://www.w3.org/1999/xhtml"
- xmlns:th="http://www.thymeleaf.org">
- <head>
- <title>hello</title>
- <script th:src="@{js/jquery.min.js}"></script>
- <script th:src="@{js/hello.js}"></script>
- </head>
- <body>
- <p><label th:text="#{welcome}"></label></p><br/>
- <span th:text="#{lang}"></span>
- <select id="locales">
- <option value=""></option>
- <option value="zh" th:text="zh"></option>
- <option value="en" th:text="en"></option>
- </select>
- </body>
- </html>
hello.js文件
- $(function () {
- $("#locales").change(function() {
- var lang = $("#locales").val();
- if (lang != "") {
- window.location.replace("/i18n?lang=" + lang);
- }
- });
- });
需要同时作用于Cookie时,修改接口控制器:
- @RequestMapping("/i18n2")
- public String changeSessionLanauage2(HttpServletRequest request, HttpServletResponse response, String lang){
- LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
- if(CommonConsts.LANG_ZH.equals(lang)){
- localeResolver.setLocale(request, response, new Locale("zh","CN"));
- }else if(CommonConsts.LANG_EN.equals(lang)){
- localeResolver.setLocale(request, response, new Locale("en","US"));
- }
- return"redirect:/hello";
- }
6、使用参数进行语言切换
使用拦截器来拦截请求接口中的参数来实现语言切换
注入区域切换拦截bean
- @Bean
- public LocaleChangeInterceptor localeChangeInterceptor() {
- LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
- //对请求路径中的参数lang进行拦截
- lci.setParamName("lang");
- return lci;
- }
- @Override
- public void addInterceptors(InterceptorRegistry registry) {
- registry.addInterceptor(localeChangeInterceptor());
- }
hello.html添加修改:
- 点击切换语言:
- <a href="/hello?lang=zh_CN">简体中文</a>
- <a href="/hello?lang=en_US">English(US)</a><br>
项目启动后点击链接测试效果即可
7、访问乱码问题解决
项目源码:github
springboot 使用i18n进行国际化的更多相关文章
- springboot 使用i18n进行国际化乱码解决
方式1.设置国际化的编码和你使用的编译器(IDEA之类)一致,如编译器为UTF-8则在application配置文件中添加 #i18n spring: messages: encoding: UTF- ...
- springboot使用i18n时properties文件中文乱码
在springboot使用i18n进行国际化文件配置时,文件名为messages_zh_CN.properties的文件中填写中文信息,当使用浏览器进行访问时,出现中文乱码,此时在idea中进行修改s ...
- SpringBoot系列——i18n国际化
前言 国际化是项目中不可或缺的功能,本文将实现springboot + thymeleaf的HTML页面.js代码.java代码国际化过程记录下来. 代码编写 工程结构 每个文件里面的值(按工程结构循 ...
- springboot、Thymeleaf、国际化的简单使用
1.项目体系结构 (1)知识体系 springboot:省去了很多繁琐的配置,如:视图解析器.前端控制器等 thymeleaf:获取controller数据逼能够进行展示 集合:用于存储数据,此练习没 ...
- struts.custom.i18n.resources国际化
每种框价都会有国际化的支持,struts2的国际化大致上分为页面的国际化,Action的国际化以及xml的国际化 首先在struts.properties文件中加入以下内容:struts.custom ...
- struts.custom.i18n.resources国际化详解(一)
每种框价都会有国际化的支持,struts2的国际化大致上分为页面的国际化,Action的国际化以及xml的国际化 首先在struts.properties文件中加入以下内容:struts.custom ...
- Go Revel - i18n(国际化)
##Messages `Messages`信息是对内容提供翻译的外部文本片段.revel提供了组织每一种语言文本片段的message文件.自动区域查找.基于cookie覆盖的消息嵌套和参数. 术语表: ...
- Angular i18n(国际化方案)
一.引言 i18n(其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数)是“国际化”的简称.在资讯领域,国际化(i18n)指让产品(出版物,软件,硬件等)无 ...
- I18n问题 国际化
http://www.cnblogs.com/guaniu/archive/2012/01/18/2325556.html java国际化 1.了解缺省Locale是由操作系统决定的,Locale是由 ...
随机推荐
- Go 面试每天一篇(第 1 天)
下面这段代码输出的内容 package main import ( "fmt" ) func main() { defer_call() } func defer_call() { ...
- .net core api服务端跨域配置
第1步:添加包引用(.net core 2.2 已自带此包,可跳过此步骤) Install-Package Microsoft.AspNetCore.Cors 第2步:在Startup.cs文件的Co ...
- 表单模糊查询的三种简单方式(springboot-h2-mybatis)
前几天运营提到说后台管理系统有几个地方想要模糊查询.. 想了下是简单的,就是要注意以前方法的被调用情况,进行增量改动,以免牵一发而动全身.整理一波记录下(本次案例是按名字模糊查询学生信息). 三种 ...
- 【selenium】- 自动化框架环境搭建
本文由小编根据慕课网视频亲自整理,转载请注明出处和作者. 1. 环境搭建 本课程选用的是selenium + java. 2. java环境的搭建 环境变量配置: 以win10为例,打开控制面板& ...
- Heron and His Triangle 2017 沈阳区域赛
A triangle is a Heron’s triangle if it satisfies that the side lengths of it are consecutive integer ...
- 基于LinkedhashMap实现的LRU算法
LRU全称是Least Recently Used,即最近最久未使用的意思.LRU算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小.也就是说,当限定的空间已存 ...
- git bash下添加忽略文件列表
转载自:https://blog.csdn.net/weixin_42808389/article/details/81232119 在用KEIL 5(MDK ARM)开发项目时需要用到GIT管理代码 ...
- C#开发BIMFACE系列27 服务端API之获取模型数据12:获取构件分类树
系列目录 [已更新最新开发文章,点击查看详细] BIMFACE官方示例中,加载三维模型后,模型浏览器中左上角默认提供了“目录树”的功能,清晰地展示了模型的完整构成及上下级关系. 本篇介绍如何获 ...
- CF979C Kuro and Walking Route(简单的dfs/树形dp)
题意:给出一个$n$个点,$n-1$条边的无向连通图,给出两个点$x,y$,经过$x$后的路径上就不能经过$y$,问可以走的路径$(u,v)$有多少条,($(u,v)$和$(v,u)$考虑为两条不同的 ...
- [3]尝试用Unity3d制作一个王者荣耀(持续更新)->选择英雄-(中)
如果已经看过本章节:目录传送门:这是目录鸭~ 上节内容写了Actor管理器,那么这一节让我们先创建一个角色.(此章节开始加速...) 1.制作角色展示AssetBundle: 提取农药某个展示模型(S ...