Spring Boot支持本地化消息,以便您的应用程序可以满足不同语言首选项的用户。默认情况下,SpringBoot默认国际化文件为:classpath:message.properties,如果放在其它文件夹中,则需要在application.yml配置属性spring.messages.basename
spring.messages.basename=i18n/messages #系统会在i118n目录下查找messages开头的文件
spring.messages.encoding =UTF-8
具体实现国际化的步骤非常简单,如下:
创建资源文件,在resources/i18n/messages目录下
message.properties (默认文件,当找不到语言的配置的时候,使用该文件进行展示)
user.name=用户名
user.password=密码
user.btn=登录
weclome=欢迎
messages_zh_CN.properties(中文)
user.name=用户名
user.password=密码
user.btn=登录
weclome=欢迎
messages_en_US.properties(英文)
user.name=UserName
user.password=Password
user.btn=Sign In
weclome=weclome
创建I18nConfig类
该类的作用是设置国际化相关的一些配置
自定义国际化配置的类主要包含的内容
1.设置以session 的方式获取local值
2.设置拦截器拦截请求中的特殊参数,根据参数的内容来改变用户的语言区域。
/**
* 资源文件配置加载
*
*/
@Configuration
public class I18nConfig implements WebMvcConfigurer
{
@Bean
public LocaleResolver localeResolver()
{
SessionLocaleResolver slr = new SessionLocaleResolver();
// 默认语言
slr.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);
return slr;
}
@Bean
public LocaleChangeInterceptor localeChangeInterceptor()
{
LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
// 参数名
lci.setParamName("lang");
return lci;
}
@Override
public void addInterceptors(InterceptorRegistry registry)
{
registry.addInterceptor(localeChangeInterceptor());
}
}
创建Controller
package org.learn.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class MyMessagesController {
@GetMapping("/")
public String hello() {
return "hello";
}
}
在页面上获国际化的值
前端页面使用的thymeleaf,后面的章节我们将会介绍该模板引擎,如果使用thymeleaf,我们在pom.xml引入相关jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
设置Tthymeleaf相关的配置信息
# 模板引擎
spring.thymeleaf. mode = HTML
spring.thymeleaf. encoding=utf-8
# 禁用缓存
spring.thymeleaf. cache = false
创建页面 hello.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="/?lang=en_US">English(US)</a>
<a href="/?lang=zh_CN">简体中文</a>
<br />
<br />
<label th:text="#{user.name}"></label><input type="text"> <br />
<label th:text="#{user.password}"></label><input type="text"><br />
<input type="button" th:value="#{user.btn}"/>
</body>
</html>
thymeleaf 标签 是通过 #{}来获取语言文件的值
通过后端渲染国际化的方法
package org.learn.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import java.util.Locale;
@Controller
public class MyMessagesController {
@Autowired
private MessageSource messageSource;
@GetMapping("/")
public String hello(Model model) {
Locale locale = LocaleContextHolder.getLocale();
model.addAttribute("weclomeLang", messageSource.getMessage("weclome", null, locale));
return "hello";
}
}
后端controller 通过messageSource.getMessage获取本地化语言文件中的内容
前端页面则增加
<h2><span th:text="${weclomeLang}"></span></h2>
如上代码获取后端本地化的内容渲染到页面中,我们可以看到获取后端的内容通过${}获取的
以上就是Spring Boot 国际化的操作。
点击Englisn
点击简体中文时
整体工程目录结构如下
本章总结:
Spring Boot 对多语言的实现在步骤上简化了很多,首先设置好资源文件(messages.properties)系统可以通过资源文件的加载通过LocaleResolver去设置相关的配置信息。前台页面可以根据多语言参数的不同加载不同的语言文件,并可以通过模板引擎文件渲染出结果。
注意的地方:
1.当我们使用Thymeleaf等动态页面时,页面文件默认是在resources/templates目录下的。静态页面时在static目录下。
2.当系统没有找到对应的语言文件时,会默认加载messages.properties文件