1、i18n介绍

  i18n(其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数)是“国际化”的简称。在资讯领域,国际化(i18n)指让产品(出版物,软件,硬件等)无需做大的改变就能够适应不同的语言和地区的需要。对程序来说,在不修改内部代码的情况下,能根据不同语言及地区显示相应的界面。

2、页面元素国际化:

  pom文件引入thymeleaf依赖:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  4. </dependency>

  新增一个html文件hello.html:

  1. <!DOCTYPE html>
  2. <html xmlns="http://www.w3.org/1999/xhtml"
  3. xmlns:th="http://www.thymeleaf.org"
  4. <head>
  5. <title>hello</title>
  6. </head>
  7. <body>
  8. <span>
  9. <label th:text="#{welcome}"></label>
  10. </span>
  11. </body>
  12. </html>

  SpringBoot 默认支持国际化的,在resources/下定义国际化文件,名称必须以messages开头,因为 MessageSourceAutoConfiguration 类中指定了前缀。

  1. messages.properties
  2. welcome = 欢迎使用i18n(默认)
  3. messages_zh_CN.properties
  4. welcome = 欢迎使用i18n(中文)
  5. messages_en_US.properties
  6. welcome = welcome to use i18n(english)

  访问接口

  1. @Controller
  2. public class HelloController {
  3.  
  4. @RequestMapping(value = "hello")
  5. public String hello() {
  6. return "hello";
  7. }
  8. }

  启动项目访问http://localhost:8080/hello就可以看到效果

3、修改默认messages配置前缀

  上面使用的是messages默认的配置,即直接放在resources/目录下,一般项目中会使用自己的目录存放,如放在resources/i18n/目录下

  在application配置中添加

  1. #i18n
  2. spring:
  3. messages:
  4. encoding: UTF-8
  5. basename: i18n/messages

  加好之后重新访问即可

4、代码中使用国际化

  1.    //注入 MessageSource 对象,通过 getMessage 方法获取信息
  2. @Autowired
  3. private MessageSource messageSource;
  4.  
  5. //使用
  6. messageSource.getMessage("welcome", null, locale);

说明:第一个参数是国际化文件的key,第二个参数是key对应value中的占位符数据(如welcome=欢迎使用{0}中的{0}就是占位符,0表示是第一个,对应数据中的第一个值),第三个是当前区域

5、会话区域解析器SessionLocaleResolver

   注入 Bean

  1. //注入 Bean,会话区域解析器只针对当前会话有效
  2. @Bean
  3. public LocaleResolver localeResolver() {
  4. SessionLocaleResolver slr = new SessionLocaleResolver();
  5. //设置默认区域,
  6. slr.setDefaultLocale(Locale.ENGLISH);
  7. return slr;
  8. }

  接口控制器:

  1.    @RequestMapping("/i18n")
  2. public String changeSessionLanauage(HttpServletRequest request, String lang){
  3. System.out.println(lang);
  4. if(CommonConsts.LANG_ZH.equals(lang)){
  5. //代码中即可通过以下方法进行语言设置
  6. request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,new Locale("zh","CN"));
  7. }else if(CommonConsts.LANG_EN.equals(lang)){
  8. request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,new Locale("en","US"));
  9. }
  10. return "redirect:/hello";
  11. }

其中request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,new Locale("zh","CN"));用于切换当前会话区域

  前端页面hello.html修改:

  1. <!DOCTYPE html>
  2. <html xmlns="http://www.w3.org/1999/xhtml"
  3. xmlns:th="http://www.thymeleaf.org">
  4. <head>
  5. <title>hello</title>
  6. <script th:src="@{js/jquery.min.js}"></script>
  7. <script th:src="@{js/hello.js}"></script>
  8. </head>
  9. <body>
  10. <p><label th:text="#{welcome}"></label></p><br/>
  11. <span th:text="#{lang}"></span>
  12. <select id="locales">
  13. <option value=""></option>
  14. <option value="zh" th:text="zh"></option>
  15. <option value="en" th:text="en"></option>
  16. </select>
  17. </body>
  18. </html>

  hello.js文件

  1. $(function () {
  2. $("#locales").change(function() {
  3. var lang = $("#locales").val();
  4. if (lang != "") {
  5. window.location.replace("/i18n?lang=" + lang);
  6. }
  7. });
  8. });

  需要同时作用于Cookie时,修改接口控制器:

  1. @RequestMapping("/i18n2")
  2. public String changeSessionLanauage2(HttpServletRequest request, HttpServletResponse response, String lang){
  3. LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
  4. if(CommonConsts.LANG_ZH.equals(lang)){
  5. localeResolver.setLocale(request, response, new Locale("zh","CN"));
  6. }else if(CommonConsts.LANG_EN.equals(lang)){
  7. localeResolver.setLocale(request, response, new Locale("en","US"));
  8. }
  9. return"redirect:/hello";
  10. }

6、使用参数进行语言切换

使用拦截器来拦截请求接口中的参数来实现语言切换

  注入区域切换拦截bean

  1. @Bean
  2. public LocaleChangeInterceptor localeChangeInterceptor() {
  3. LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
  4.      //对请求路径中的参数lang进行拦截
  5. lci.setParamName("lang");
  6.  
  7. return lci;
  8. }
  9.  
  10. @Override
  11. public void addInterceptors(InterceptorRegistry registry) {
  12. registry.addInterceptor(localeChangeInterceptor());
  13. }

  hello.html添加修改:

  1. 点击切换语言:
  2. <a href="/hello?lang=zh_CN">简体中文</a> &nbsp;&nbsp;
  3. <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. 通过Web安全工具Burp suite找出网站中的XSS漏洞实战(二)

    一.背景 笔者6月份在慕课网录制视频教程XSS跨站漏洞 加强Web安全,里面需要讲到很多实战案例,在漏洞挖掘案例中分为了手工挖掘.工具挖掘.代码审计三部分内容,手工挖掘篇参考地址为快速找出网站中可能存 ...

  2. ResourceManager学习之Application,状态机管理

    Application管理 YARN中,Application是指应用程序,他可能启动多个运行实例,每个运行实例由一个ApplicationMaster与一组该ApplicationMaster启动的 ...

  3. 第10章 文档对象模型DOM 10.3 Element类型

    Element 类型用于表现 XML或 HTML元素,提供了对元素标签名.子节点及特性的访问. 要访问元素的标签名,可以使用 nodeName 属性,也可以使用 tagName 属性:这两个属性会返回 ...

  4. 洛谷P1240-诸侯安置+递推非搜索

    诸侯安置 这道题是一题递推题,一开始自己不知道,用了搜索,只过了三个样例: 两两相同的合并, 成 1,1,3,3,5,5........n*2-1; 然后我们会容易发现一种不同与搜索的动态规划做法. ...

  5. POJ 1182 食物链(经典并查集) (多组输入有时乱加也会错!)

      多组输入有时乱加也会错! 这次用多组输入竟然,不用竟然对了,所以以后做题目,若是答案错误,先看加上或者删掉多组输入,看对不对 食物链 Time Limit: 1000MS   Memory Lim ...

  6. codeforces 811 E. Vladik and Entertaining Flags(线段树+并查集)

    题目链接:http://codeforces.com/contest/811/problem/E 题意:给定一个行数为10 列数10w的矩阵,每个方块是一个整数, 给定l和r 求范围内的联通块数量 所 ...

  7. IDEA 中用好 Lombok,撸码效率至少提升5倍!

    来 源:http://t.cn/EXhxRzV 以前的Java项目中,充斥着太多不友好的代码:POJO的getter/setter/toString:异常处理:I/O流的关闭操作等等,这些样板代码既没 ...

  8. postman--请求以及变量设置的实例练习

    我们可以在2个地方添加需要执行的js脚本,一个是Pre-request Script,还有一个tests,我们先看请求之前的 1 在请求被发送到服务器之前:就是在“Pre-request Script ...

  9. 可见性有序性,Happens-before来搞定

    写在前面 上一篇文章并发 Bug 之源有三,请睁大眼睛看清它们 谈到了可见性/原子性/有序性三个问题,这些问题通常违背我们的直觉和思考模式,也就导致了很多并发 Bug 为了解决 CPU,内存,IO 的 ...

  10. FreeSql (九)删除数据

    删除是一个非常危险的操作,FreeSql对删除支持并不强大,仅支持了单表有条件的删除方法. 不想过多的介绍拉长删除数据的系列文章,删除数据的介绍仅此一篇. 若Where条件为空的时候执行方法,Free ...