本周介绍SpringBoot项目的国际化是如何处理的,阅读本章前请阅读【SpringBoot】SpringBoot与Thymeleaf模版(六)的相关内容

国际化原理

  1、在Spring中有国际化Locale(区域信息对象);LocaleResolver(获取区域信息对象,区域信息解析器),2个重要的对象,通过区域信息解析器就能自动给页面绑定不同的数据内容。

  2、查看SpringBoot项目中,WebMvcAutoConfiguration类中有注入区域信息解析器AcceptHeaderLocaleResolver

 // 注入区域信息解析器
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = "spring.mvc", name = "locale")
public LocaleResolver localeResolver() {
if (this.mvcProperties.getLocaleResolver() == WebMvcProperties.LocaleResolver.FIXED) {
return new FixedLocaleResolver(this.mvcProperties.getLocale());
}
// 默认注入AcceptHeaderLocaleResolver区域信息解析器
AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
localeResolver.setDefaultLocale(this.mvcProperties.getLocale());
return localeResolver;
}

  3、查看AcceptHeaderLocaleResolver.java源码,它返回的区域信息对象,是从请求头获取 语言信息

 @Override
public Locale resolveLocale(HttpServletRequest request) {
Locale defaultLocale = getDefaultLocale();
if (defaultLocale != null && request.getHeader("Accept-Language") == null) {
return defaultLocale;
}
// 从请求中获取 语言类型
Locale requestLocale = request.getLocale();
List<Locale> supportedLocales = getSupportedLocales();
if (supportedLocales.isEmpty() || supportedLocales.contains(requestLocale)) {
return requestLocale;
}
Locale supportedLocale = findSupportedLocale(request, supportedLocales);
if (supportedLocale != null) {
return supportedLocale;
}
return (defaultLocale != null ? defaultLocale : requestLocale);
}

  4、F12查看浏览器请求,发现所有请求都会带上语言信息

    

国际化开发

  1、新建一个SpringBoot的web项目。pom.xml文件如下:

 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.test</groupId>
<artifactId>test-springboot-i18n</artifactId>
<version>1.0-SNAPSHOT</version> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.8.RELEASE</version>
</parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties> <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>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> </dependencies> <!-- SpringBoot打包插件,可以将代码打包成一个可执行的jar包 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

  2、编写国际化配置文件,一个默认配置文件,一个英文配置文件,一个中文配置文件

    

    内容如下:

 login.tip=请登录~
login.username=用户名~
login.password=密码~
login.btn=登陆~

  3、在SpringBoot的配置文件(application.properties)中绑定国际化配置文件

 # 国际化配置文件
spring.messages.basename=i18n.login

  4、编辑controller,转发界面

 @Controller
public class LoginController { @RequestMapping(value = "/login")
public String toLogin(){
return "login";
} }

  5、编写login.html页面

 <!DOCTYPE html>
<!--
xmlns:th="http://www.thymeleaf.org" 的作用是增加thymeleaf的语法提示
-->
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body style="text-align:center">
<h4>[[#{login.tip }]]</h4>
<form>
[[#{login.username}]]:<input type="text"/><br>
[[#{login.password}]]:<input type="password"/><br>
<button type="submit">[[#{login.btn}]]</button>
</form>
<a>中文</a> <a>English</a>
</body>
</html>

  6、重启项目,使用地址:http://localhost:8080/login,进行访问,通过浏览器设置,改变浏览器语音的值,可以看到界面上的变化

    中文版:    英文版:

自定义区域信息解析器

  逻辑:编辑一个区域信息解析器,从请求参数中获取区域信息,没传参数使用默认的区域信息。

  1、编辑区域信息解析器,MyLocaleResoler.java

 package com.test.springboot.i18n.component;

 import org.springframework.util.StringUtils;
import org.springframework.web.servlet.LocaleResolver; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale; public class MyLocaleResoler implements LocaleResolver { @Override
public Locale resolveLocale(HttpServletRequest request) {
String l = request.getParameter("l");
Locale locale = Locale.getDefault();
if(!StringUtils.isEmpty(l)) {
String[] split = l.split("_");
locale = new Locale(split[0], split[1]);
}
return locale;
} @Override
public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) { }
}

  2、注入Spring容器中,在Application.java类中添加一个方法。

 // 向容器中注入LocaleResolver
@Bean
public LocaleResolver localeResolver(){
return new MyLocaleResoler();
}

  3、编写前端页面,是请求带上不同的参数,login.html,如下:

 <!DOCTYPE html>
<!--
xmlns:th="http://www.thymeleaf.org" 的作用是增加thymeleaf的语法提示
-->
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body style="text-align:center">
<h4>[[#{login.tip }]]</h4>
<form>
[[#{login.username}]]:<input type="text"/><br>
[[#{login.password}]]:<input type="password"/><br>
<button type="submit">[[#{login.btn}]]</button>
</form>
<!-- 请求带上语言的相关参数 -->
<a th:href="@{/login(l='zh_CN')}">中文</a> <a th:href="@{/login(l='en_US')}">English</a>
</body>
</html>

  4、重启项目,使用浏览器访问界面,效果如下:

    

  

最新文章

  1. MongoDB常用操作--集合2
  2. PAT——乙级真题1003代码
  3. 枚举 POJ 1753 Flip Game
  4. linux笔记:linux常用命令-目录和文件处理命令
  5. SqlServer性能急剧下降,查看所有会话的状态及等待类型---Latch_Ex
  6. DOM对象和JQuery对象的区别
  7. 研究一家公司 z
  8. How to make vcredist_x86 reinstall only if not yet installed
  9. GCD 延时操作
  10. mysql函数操作(4)
  11. 左右10g DG中间ORA-19527和ORA-00312错误解决演示示例
  12. ab返回结果参数分析
  13. /opt/apache-tomcat-7.0.57/conf/catalina.policy(权限不够)
  14. #254 Find the Longest Word in a String
  15. bat命令查询硬件信息
  16. Rancher 容器管理平台-实战训练营-免费视频培训
  17. 55.storm 之 hello word(本地模式)
  18. web自动化时,sendkeys输入长文本时浏览器响应慢或错误时处理
  19. Linux——系统引导流程学习简单笔记
  20. Jmeter元件作用域

热门文章

  1. 团队——Beta版本发布
  2. Vuex状态数据源state
  3. P5022 旅行[基环树]
  4. 201671010438王奕晗实验十四 团队项目评审&amp;课程学习总结
  5. 项目Beta冲刺(团队)--4/7
  6. HDU4624 Endless Spin 和 HAOI2015 按位或
  7. 74HC595 8位移位寄存器的使用小结
  8. Vuejs指令
  9. 【CF1042F】Leaf Sets
  10. Java动态调用脚本语言Groovy