国际化是我们开发多语言网站不可缺少的需求,本篇将介绍SpringBoot 在项目中如何使用国际化。
1. 介绍
在SpringBoot 中我们可以利用ResourceBundleMessageSource进行国际化网站的开发,它是SpringBoot提供的内置功能。
为了可以看到国际化的效果,这里添加thymeleaf 模板依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
2. 项目结构
默认情况下,SpringBoot 应用程序将在 /src/main/resources 文件夹下查找国际化的配置。
src/
|-- main/
|-- resources/
|-- messages.properties
|-- messages_cn.properties
|-- messages_en.properties
默认语言环境文件将命名为 messages.properties,其它的语言环境格式为messages_xx.properties,其中 xx 是语言环境代码。在我们的例子中有中午和英文的国际化消息,其中
- messages_cn.properties为中文国际化内容
- messages_en.properties为英文国际化内容
所有国际化文件中的key都是相同的,value是根据语言代码自定义显示。
下面给出这三个文件的配置
messages.properties
website.name=易学教程
website.keywords=Spirng boot 教程
lang.change=选择语言
lang.en=英文
lang.cn=中文
lang.select=请选择
messages_en.properties
website.name=Easy study tutorial
website.keywords=Spirng boot tutorial
lang.change=select language
lang.en=english
lang.cn=chinese
lang.select=please choose
messages_cn.properties
website.name=易学教程
website.keywords=Spirng boot 教程
lang.change=选择语言
lang.en=英文
lang.cn=中文
lang.select=请选择
3. LocaleResolver
LocaleResolver接口用于配置语言环境用哪种语言。
@Bean
public LocaleResolver localeResolver(){
SessionLocaleResolver localeResolver = new SessionLocaleResolver();
localeResolver.setDefaultLocale(Locale.US);
return localeResolver;
}
4. LocaleChangeInterceptor
配置一个可以改变语言环境的拦截器。
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
localeChangeInterceptor.setParamName("lang");
return localeChangeInterceptor;
}
LocalCangeInterceptor使用的默认参数名称是"locale",这里我们配置"lang"作为参数。添加拦截器。
@Override
public void addInterceptors(InterceptorRegistry registry){
registry.addInterceptor(localeChangeInterceptor());
}
完成的国际化配置代码如下:
package com.example.yxjc.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
import java.util.Locale;
@Configuration
public class LanConfig extends WebMvcConfigurerAdapter {
@Bean
public LocaleResolver localeResolver(){
SessionLocaleResolver localeResolver = new SessionLocaleResolver();
localeResolver.setDefaultLocale(Locale.US);
return localeResolver;
}
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
localeChangeInterceptor.setParamName("lang");
return localeChangeInterceptor;
}
@Override
public void addInterceptors(InterceptorRegistry registry){
registry.addInterceptor(localeChangeInterceptor());
}
}
5. 控制器
为了呈现多语言的效果,我们需要一个控制器来显示一个页面,以查看 Spring Boot 国际化的实际效果。
@Controller
public class LanController {
@RequestMapping("/lan/hello")
public String hello() {
return "lan/hello";
}
}
6. 模板文件
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
</head>
<body>
<h1 th:text="#{website.name}"></h1>
<p th:text="#{website.keywords}"></p>
<span th:text="#{lang.change}"></span>:
<select id="locales">
<option value="" th:text="#{lang.select}"></option>
<option value="en" th:text="#{lang.en}"></option>
<option value="cn" th:text="#{lang.cn}"></option>
</select>
</body>
<script type="text/javascript">
$(document).ready(function () {
$("#locales").change(function () {
var selectedOption = $('#locales').val();
if (selectedOption != '') {
window.location.replace('?lang=' + selectedOption);
}
});
});
</script>
</html>
7. Springboot 主类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class YxjcSpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(YxjcSpringBootApplication.class, args);
}
}
启动应用程序。浏览器访问 localhost:8088/lan/hello。我们将看到.8. 国际化异常信息
我们可以使用 SpringBoot 国际化支持来提供本地化的异常或验证消息。 为了处理异常,我们可以使用 Spring 提供的全局异常处理机制。
我们可以在国际化配置文件 message.properties 中定义我们的验证或异常消息。
NotNull.username=用户名不能为空
NotNull.password=密码不能为空
Exception.notFound=没有找到id信息为空{0} 可能找到id信息为空 {1}.
每当验证失败时,SpringBoot 都会根据注解名称返回特定的消息。