ramostear.comramostear.com 谭朝红的技术分享博客

格言 编程是一门技术,也是一门艺术 !

在Spring Boot中提供国际化支持

在Spring Boot中提供国际化支持

Spring Boot(十四)— 国际化支持

国际化是一个可以让应用程序适应不同语言和区域显示而无需修改工程代码的一种软件本地化自适应能力。在本章节中,将使用Spring Boot与Thymeleaf来演示国际化的支持,系统会自动根据当前的语言环境或者Session中的语言来读取对应的语言模板。

依赖

需要将Spring Boot Web Starter和Spring Boot Thymeleaf Starter依赖加入到工程中。下面是Maven的build文件内容:

<?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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.ramostear</groupId>
    <artifactId>i18n</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>i18n</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

配置LocaleResolver

需要为应用程序配置一个默认的本地化语言环境的解析器。在Spring Boot应用程序中,可以通过下面的方式配置一个默认的 LocaleResolver:

@Bean
    public LocaleResolver localeResolver(){
        SessionLocaleResolver resolver = new SessionLocaleResolver();
        resolver.setDefaultLocale(Locale.US);
        return resolver;
    }

配置拦截器

需要使用LocaleChangeInterceptor拦截语言参数的变化,并设置语言参数的名称。

@Bean
    public LocaleChangeInterceptor localeChangeInterceptor(){
        LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
        interceptor.setParamName("lang");
        return interceptor;
    }

注册拦截器

为了让LocaleChangeInterceptor生效,需要将拦截器注册到Spring Boot的拦截器注册表中。

@Override
    public void addInterceptors(InterceptorRegistry registry){
        registry.addInterceptor(localeChangeInterceptor());
    }

国际化消息资源

在默认的情况下,Spring Boot 应用程序从类路径src/main/resources目录中获取国际化消息资源。缺省语言资源文件名为message.properties,其他不同语言的资源文件命名模式为:message_xx.properties.xx代表区域代码。

我们提供两种语言的显示,一种时默认的英语消息,一种是中文消息。英语的资源文件配置在index.properties中进行设置。

index.msg = welcome to spring boot i18n tutorial.

中文资源在index_zh_CN.properties中进行设置。

index.msg = 欢迎阅读Spring Boot 国际化教程.

视图模板

在模板页面中,使用语法#{key}的方式获取国际化资源文件设置的值

<h1 th:text="#{index.msg}"></h1>

控制器

这里我们创建一个简单的控制器,返回视图路径即可:

package com.ramostear.application.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

/**
 * @author ramostear
 * @create-time 2019/3/11 0011-18:12
 * @modify by :
 * @since:
 */
@Controller
public class I18NController {

    @GetMapping("/index.html")
    public String index(){
        return "index";
    }
}

运行测试

启动应用程序,打开浏览器并在地址栏输入:http://localhost:8080/index

此时,没有给任何的语言参数,Spring Boot应用程序默认使用US资源文件。

接下来,修改请求地址为:http://localhost:8080/index?lang=zh_CN :

现在,已经成功将界面从英文状态切换到中文状态进行显示。

代码清单

本次教程的源代码已经上传到github仓库,点击下面的链接可以获得所有的源码:https://github.com/ramostear/spring-boot-i18n-tutorial

(转载本站文章请注明作者和出处:谭朝红-ramostear.com,未经允许请勿做任何商业用途)

发表评论