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> &nbsp;&nbsp;
<a href="/hello?lang=en_US">English(US)</a><br>

项目启动后点击链接测试效果即可

7、访问乱码问题解决

见springboot使用i18n乱码

项目源码:github

springboot 使用i18n进行国际化的更多相关文章

  1. springboot 使用i18n进行国际化乱码解决

    方式1.设置国际化的编码和你使用的编译器(IDEA之类)一致,如编译器为UTF-8则在application配置文件中添加 #i18n spring: messages: encoding: UTF- ...

  2. springboot使用i18n时properties文件中文乱码

    在springboot使用i18n进行国际化文件配置时,文件名为messages_zh_CN.properties的文件中填写中文信息,当使用浏览器进行访问时,出现中文乱码,此时在idea中进行修改s ...

  3. SpringBoot系列——i18n国际化

    前言 国际化是项目中不可或缺的功能,本文将实现springboot + thymeleaf的HTML页面.js代码.java代码国际化过程记录下来. 代码编写 工程结构 每个文件里面的值(按工程结构循 ...

  4. springboot、Thymeleaf、国际化的简单使用

    1.项目体系结构 (1)知识体系 springboot:省去了很多繁琐的配置,如:视图解析器.前端控制器等 thymeleaf:获取controller数据逼能够进行展示 集合:用于存储数据,此练习没 ...

  5. struts.custom.i18n.resources国际化

    每种框价都会有国际化的支持,struts2的国际化大致上分为页面的国际化,Action的国际化以及xml的国际化 首先在struts.properties文件中加入以下内容:struts.custom ...

  6. struts.custom.i18n.resources国际化详解(一)

    每种框价都会有国际化的支持,struts2的国际化大致上分为页面的国际化,Action的国际化以及xml的国际化 首先在struts.properties文件中加入以下内容:struts.custom ...

  7. Go Revel - i18n(国际化)

    ##Messages `Messages`信息是对内容提供翻译的外部文本片段.revel提供了组织每一种语言文本片段的message文件.自动区域查找.基于cookie覆盖的消息嵌套和参数. 术语表: ...

  8. Angular i18n(国际化方案)

    一.引言 i18n(其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数)是“国际化”的简称.在资讯领域,国际化(i18n)指让产品(出版物,软件,硬件等)无 ...

  9. I18n问题 国际化

    http://www.cnblogs.com/guaniu/archive/2012/01/18/2325556.html java国际化 1.了解缺省Locale是由操作系统决定的,Locale是由 ...

随机推荐

  1. codeblocks中文乱码原因及解决办法

    原因:(本地化做得不够好)默认情况下codeblocks编辑器保存源文件是保存为windows本地编码,就是WINDOWS-936字符集,即GBK:但CB的编辑器在默认编辑的时候是按照UTF-8来解析 ...

  2. matplotlib绘制矢量图像(svg),pdf and ps文件

    机器学习的过程中处理数据,会遇到数据可视化的问题. 大部分都是利用python的matplotlib库进行数据的可视化处理. plt.show() 默认都是输出.png文件,图片只要稍微放大一点,就糊 ...

  3. CodeForces 1107 F Vasya and Endless Credits

    题目传送门 题解: 需要注意到的是 每个offer都获益都是会随着时间的增加而渐少(或不变). 所以我们可以知道,最多在第n个月的时候这个人会买车离开. solve1:最优2分图匹配 我们可以把每个月 ...

  4. lightoj 1283 - Shelving Books(记忆化搜索+区间dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1283 题解:这题很显然一看就像是区间dp,但是单纯的区间dp好像解决不了问题可 ...

  5. Codeforces Technocup 2017 - Elimination Round 2 D. Sea Battle(贪心)

    题目链接 http://codeforces.com/contest/729/problem/D 题意:给你一个1*n的区域有a艘船,每艘船宽b,已经开了k枪都没打到,问你最少再开几枪至少能打到一艘船 ...

  6. [DP]换钱的最小货币数

    题目一 给定数组arr,数组中有N个元素,其中所有的之都为整数且不重复.每个只代表一种面值的货币,每种面值的货币可以使用任意张,在给定一个整数aim代表要找的钱数,求组成aim的最少货币数. 解法 依 ...

  7. 浅谈contentType = false

    转自https://segmentfault.com/a/1190000007207128 在刚接触 JQuery 中的 ajax 时,对其 contentType 并没有很在意,只是知晓它是代表发送 ...

  8. Android源码阅读技巧--查找开发者选项中显示触摸操作源码

    在开发者模式下,在开发者选项中,可以勾选“显示触摸操作”,然后只要点击屏幕就会在点击的位置有圈圈显示.如何找到绘制圈圈的代码部分,有什么技巧来阅读代码量这么大的android系统源码呢?以下请跟着小老 ...

  9. Numpy版本问题,import tensorflow as tf 报警:“ FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'”

    tensorflow成功安装后 import tensorflow as tf 报警:“ FutureWarning: Passing (type, 1) or '1type' as a synony ...

  10. WoSign新证书系统通过德国Cure53安全测试

    近日,沃通WoSign新证书系统顺利通过德国Cure53白盒子安全测试,并公开发布审计报告总结版. 据悉,根据去年10月份Mozilla提出的整改要求,沃通WoSign投入研发力量高标准严要求地重新开 ...