前言


在项目开发中,可能遇到国际化的问题,而支持国际化却是一件很头疼的事。但spring boot给出了一个非常理想和方便的方案。

一、准备工作


pom.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5.  
  6. <groupId>com.example</groupId>
  7. <artifactId>spring-boot-14</artifactId>
  8. <version>0.0.1-SNAPSHOT</version>
  9. <packaging>jar</packaging>
  10.  
  11. <name>spring-boot-14</name>
  12. <description>Demo project for Spring Boot</description>
  13.  
  14. <parent>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-starter-parent</artifactId>
  17. <version>1.5.3.RELEASE</version>
  18. <relativePath/> <!-- lookup parent from repository -->
  19. </parent>
  20.  
  21. <properties>
  22. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  23. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  24. <java.version>1.8</java.version>
  25. </properties>
  26.  
  27. <dependencies>
  28. <dependency>
  29. <groupId>org.springframework.boot</groupId>
  30. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-starter-web</artifactId>
  35. </dependency>
  36.  
  37. <dependency>
  38. <groupId>org.springframework.boot</groupId>
  39. <artifactId>spring-boot-devtools</artifactId>
  40. <scope>runtime</scope>
  41. </dependency>
  42. <dependency>
  43. <groupId>org.springframework.boot</groupId>
  44. <artifactId>spring-boot-starter-test</artifactId>
  45. <scope>test</scope>
  46. </dependency>
  47. </dependencies>
  48.  
  49. <build>
  50. <plugins>
  51. <plugin>
  52. <groupId>org.springframework.boot</groupId>
  53. <artifactId>spring-boot-maven-plugin</artifactId>
  54. </plugin>
  55. </plugins>
  56. </build>
  57.  
  58. </project>

pom.xml

App.java:

  1. package com.example;
  2.  
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5.  
  6. @SpringBootApplication
  7. public class App {
  8.  
  9. public static void main(String[] args) {
  10. SpringApplication.run(App.class, args);
  11. }
  12. }

App.java

创建国际化配置文件:LocaleConfig.java

  1. package com.example;
  2.  
  3. import java.util.Locale;
  4.  
  5. import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.context.annotation.ComponentScan;
  8. import org.springframework.context.annotation.Configuration;
  9. import org.springframework.web.servlet.LocaleResolver;
  10. import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
  11. import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
  12. import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
  13. import org.springframework.web.servlet.i18n.SessionLocaleResolver;
  14.  
  15. @Configuration
  16. @EnableAutoConfiguration
  17. @ComponentScan
  18. public class LocaleConfig extends WebMvcConfigurerAdapter {
  19.  
  20. @Bean
  21. public LocaleResolver localeResolver() {
  22. SessionLocaleResolver slr = new SessionLocaleResolver();
  23. // 默认语言
  24. slr.setDefaultLocale(Locale.US);
  25. return slr;
  26. }
  27.  
  28. @Bean
  29. public LocaleChangeInterceptor localeChangeInterceptor() {
  30. LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
  31. // 参数名
  32. lci.setParamName("lang");
  33. return lci;
  34. }
  35.  
  36. @Override
  37. public void addInterceptors(InterceptorRegistry registry) {
  38. registry.addInterceptor(localeChangeInterceptor());
  39. }
  40. }

MainController.java:

  1. package com.example;
  2.  
  3. import org.springframework.stereotype.Controller;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5.  
  6. /**
  7. * 控制器 博客出处:http://www.cnblogs.com/GoodHelper/
  8. *
  9. */
  10. @Controller
  11. public class MainController {
  12.  
  13. @GetMapping("/")
  14. public String index() {
  15. return "index";
  16. }
  17.  
  18. }

在resources目录增加两个properties文件,分别为:

messages_en_US.properties:

  1. hello=hello

messages_zh_CN.properties:

  1. hello=\u4F60\u597D

二、前端调用


在thymeleaf模板引擎中使用#{}的标签就能调用messages中的内容

index.html:

  1. <!DOCTYPE html>
  2. <html xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  5. <title>玩转spring boot——国际化</title>
  6. </head>
  7. <body>
  8. <h1>玩转spring boot——国际化</h1>
  9. <h4>
  10. <a href="http://www.cnblogs.com/GoodHelper/">from 刘冬的博客</a>
  11. </h4>
  12. <br />
  13. <br />
  14. <a href="/?lang=en_US">English(US)</a>
  15. <a href="/?lang=zh_CN">简体中文</a>
  16. <br />
  17.  
  18. <h3 th:text="#{hello}"></h3>
  19. <br />
  20. <br />
  21. <a href="http://www.cnblogs.com/GoodHelper/">点击访问原版博客(www.cnblogs.com/GoodHelper)</a>
  22. </body>
  23. </html>

项目结构如下:

运行效果:

三、后端渲染


修改MainController类:

  1. package com.example;
  2.  
  3. import java.util.Locale;
  4.  
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.context.MessageSource;
  7. import org.springframework.context.i18n.LocaleContextHolder;
  8. import org.springframework.stereotype.Controller;
  9. import org.springframework.ui.Model;
  10. import org.springframework.web.bind.annotation.GetMapping;
  11.  
  12. /**
  13. * 控制器 博客出处:http://www.cnblogs.com/GoodHelper/
  14. *
  15. */
  16. @Controller
  17. public class MainController {
  18.  
  19. @Autowired
  20. private MessageSource messageSource;
  21.  
  22. @GetMapping("/")
  23. public String index(Model model) {
  24. Locale locale = LocaleContextHolder.getLocale();
  25. model.addAttribute("world", messageSource.getMessage("world", null, locale));
  26. return "index";
  27. }
  28.  
  29. }

其中,MessageSource类可以获取messages的内容。

index.html:

  1. <!DOCTYPE html>
  2. <html xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  5. <title>玩转spring boot——国际化</title>
  6. </head>
  7. <body>
  8. <h1>玩转spring boot——国际化</h1>
  9. <h4>
  10. <a href="http://www.cnblogs.com/GoodHelper/">from 刘冬的博客</a>
  11. </h4>
  12. <br />
  13. <br />
  14. <a href="/?lang=en_US">English(US)</a>
  15. <a href="/?lang=zh_CN">简体中文</a>
  16. <br />
  17.  
  18. <h3 th:text="#{hello} + ' , ' + ${world}"></h3>
  19. <br />
  20. <br />
  21. <a href="http://www.cnblogs.com/GoodHelper/">点击访问原版博客(www.cnblogs.com/GoodHelper)</a>
  22. </body>
  23. </html>

一个使用了#{}标签直接调用messages的内容,另一个使用了${}标签来获取后台的值

运行效果:

 总结


  国际化就已经实现了,然而更完美的做法是当第一次请求时,在后台通过Request获取到一个初始的语言。当获取到的语言和用户所需要的语言不一直时,才需要在前端UI再去设置哪个语言是用户所需要的。

代码下载:https://github.com/carter659/spring-boot-14.git

如果你觉得我的博客对你有帮助,可以给我点儿打赏,左侧微信,右侧支付宝。

有可能就是你的一点打赏会让我的博客写的更好:)

返回玩转spring boot系列目录

玩转spring boot——国际化的更多相关文章

  1. 玩转spring boot——快速开始

    开发环境: IED环境:Eclipse JDK版本:1.8 maven版本:3.3.9 一.创建一个spring boot的mcv web应用程序 打开Eclipse,新建Maven项目 选择quic ...

  2. 玩转spring boot——开篇

    很久没写博客了,而这一转眼就是7年.这段时间并不是我没学习东西,而是园友们的技术提高的非常快,这反而让我不知道该写些什么.我做程序已经有十几年之久了,可以说是彻彻底底的“程序老炮”,至于技术怎么样?我 ...

  3. 玩转spring boot——结合redis

    一.准备工作 下载redis的windows版zip包:https://github.com/MSOpenTech/redis/releases 运行redis-server.exe程序 出现黑色窗口 ...

  4. 玩转spring boot——AOP与表单验证

    AOP在大多数的情况下的应用场景是:日志和验证.至于AOP的理论知识我就不做赘述.而AOP的通知类型有好几种,今天的例子我只选一个有代表意义的“环绕通知”来演示. 一.AOP入门 修改“pom.xml ...

  5. 玩转spring boot——结合JPA入门

    参考官方例子:https://spring.io/guides/gs/accessing-data-jpa/ 接着上篇内容 一.小试牛刀 创建maven项目后,修改pom.xml文件 <proj ...

  6. 玩转spring boot——结合JPA事务

    接着上篇 一.准备工作 修改pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...

  7. 玩转spring boot——结合AngularJs和JDBC

    参考官方例子:http://spring.io/guides/gs/relational-data-access/ 一.项目准备 在建立mysql数据库后新建表“t_order” ; -- ----- ...

  8. 玩转spring boot——结合jQuery和AngularJs

    在上篇的基础上 准备工作: 修改pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...

  9. 玩转spring boot——MVC应用

    如何快速搭建一个MCV程序? 参照spring官方例子:https://spring.io/guides/gs/serving-web-content/ 一.spring mvc结合thymeleaf ...

随机推荐

  1. 【Java学习笔记之十三】初探Java面向对象的过程及代码实现

    理解Java面向对象的重要知识点: 一. 类,对象 类?首先举一个例子:小李设计了一张汽车设计图,然后交给生产车间来生产汽车,有黑色的.红色的.白色的... 这里,汽车设计图就是我们说的类(class ...

  2. poj_2528Mayor's posters(线段树)

    poj_2528Mayor's posters(线段树) 标签: 线段树 题目连接 Mayor's posters Time Limit: 1000MS Memory Limit: 65536K To ...

  3. 机器学习笔记5-Tensorflow高级API之tf.estimator

    前言 本文接着上一篇继续来聊Tensorflow的接口,上一篇中用较低层的接口实现了线性模型,本篇中将用更高级的API--tf.estimator来改写线性模型. 还记得之前的文章<机器学习笔记 ...

  4. [国嵌攻略][173][BOA嵌入式服务器移植]

    1.解压boa嵌入式web服务 tar zxvf boa-0.94.13.tar.gz 2.进入src目录生成配置文件 ./configure 3.修改生成的Makefile CC=arm-linux ...

  5. Web前端:改变鼠标样式

    <span style="cursor:auto">浏览器设置的光标</span><br /> <span style="cur ...

  6. 把VueThink整合到已有ThinkPHP 5.0项目中

     享 关键字: VueThink ThinkPHP5.0 Vue2.x TP5 管理后台扩展 VueThink初认识 VueThink,是一个很不错的技术框架,由广州洪睿科技的技术团队2016年研发( ...

  7. OpenCV3.4两种立体匹配算法效果对比

    以OpenCV自带的Aloe图像对为例:     1.BM算法(Block Matching) 参数设置如下: ) + ) & -; cv::Ptr<cv::StereoBM> b ...

  8. CCF系列之窗口(201403-2)

    试题编号: 201403-2时间限制: 1.0s 内存限制: 256.0MB 问题描述 在某图形操作系统中,有 N 个窗口,每个窗口都是一个两边与坐标轴分别平行的矩形区域.窗口的边界上的点也属于该窗口 ...

  9. eclipse导入项目之后有感叹号

    说明项目的编译过程报错.导致原因:项目引入后,需要重新配置jar包路径. 1.右击你的项目-->Build Path-->Configure Build Path.... 2.在弹出的对话 ...

  10. jQuery给input绑定回车事件

    dataInput为Span元素ID <script type="text/javascript" src="Scripts/jquery-1.6.2.js&quo ...