国际化是我们开发多语言网站不可缺少的需求,本篇将介绍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。我们将看到.

SpringBoot 国际化

8. 国际化异常信息

我们可以使用 SpringBoot 国际化支持来提供本地化的异常或验证消息。 为了处理异常,我们可以使用 Spring 提供的全局异常处理机制。

我们可以在国际化配置文件 message.properties 中定义我们的验证或异常消息。

NotNull.username=用户名不能为空
NotNull.password=密码不能为空
Exception.notFound=没有找到id信息为空{0} 可能找到id信息为空 {1}.
每当验证失败时,SpringBoot 都会根据注解名称返回特定的消息。