Spring Boot 教程:国际化

    国际化是一种处理机制,使得你的应用可以适配不同的语言和区域而无需更改源代码。换言之,国际化是为本地化而准备。
    本文将带你学习在 Spring Boot 中如何实现国际化的细节。

依赖

    在 Spring Boot 中开发 web 应用,我们需要依赖 Spring Boot Starter Web 和 Spring Boot Starter Thymeleaf 依赖项。

Maven

1 <dependency>
2    <groupId>org.springframework.boot</groupId>
3    <artifactId>spring-boot-starter-web</artifactId>
4 </dependency>
5 
6 <dependency>
7    <groupId>org.springframework.boot</groupId>
8    <artifactId>spring-boot-starter-thymeleaf</artifactId>
9 </dependency>Gradle

 

Gradle

1 compile('org.springframework.boot:spring-boot-starter-web')
2 compile group: 'org.springframework.boot', name: 'spring-boot-starter-thymeleaf'

LocaleResolver

    要确定你的应用的缺省本地化,需要在 Spring Boot 应用中 增加 LocaleResolver bean。
1 @Bean
2 public LocaleResolver localeResolver() {
3    SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
4    sessionLocaleResolver.setDefaultLocale(Locale.US);
5    return sessionLocaleResolver;
6 }

LocaleChangeInterceptor

    LocaleChangeInterceptor 用于根据请求所带的语言参数来切换新的本地化。
1 @Bean
2 public LocaleChangeInterceptor localeChangeInterceptor() {
3    LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
4    localeChangeInterceptor.setParamName("language");
5    return localeChangeInterceptor;
6 }
    要把 LocaleChangeInterceptor 加到应用注册拦截器中才能生效。这个配置类应当继承 WebMvcConfigurerAdapter 类且重载 addInterceptors() 方法。
@Override
1 public void addInterceptors(InterceptorRegistry registry) {
2    registry.addInterceptor(localeChangeInterceptor());
3 }

消息资源

    Spring Boot 应用默认从 classpath 路径下的 src/main/resources 文件夹获取消息源。缺省本地化消息文件名应当是 message.properties,每个本地化文件名应当类似  messages_XX.properties。“XX” 代表本地化代号。
    所有的消息属性应当以键值方式表达。如果任意属性没有在本地化中找到,应用就从 messages.properties 文件中获取缺省值。
    缺省 messages.properties 如下所示:
welcome.text=Hi Welcome to Everyone
    法语 messages_cn.properties 如下所示:
welcome.text=Salut Bienvenue à tous
注意:消息源文件应当以 “UTF-8” 格式存储。

HTML 文件

    在 HTML 文件中,使用 #{key} 语法来显示属性文件中获取的消息。
<h1 th:text = "#{welcome.text}"></h1>
    完整的代码如下:

Maven – pom.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <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
 3 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 4    <modelVersion>4.0.0</modelVersion>
 5    <groupId>com.tutorialspoint</groupId>
 6    <artifactId>demo</artifactId>
 7    <version>0.0.1-SNAPSHOT</version>
 8    <packaging>jar</packaging>
 9    <name>demo</name>
10    <description>Demo project for Spring Boot</description>
11  
12    <parent>
13       <groupId>org.springframework.boot</groupId>
14       <artifactId>spring-boot-starter-parent</artifactId>
15       <version>1.5.8.RELEASE</version>
16       <relativePath />
17    </parent>
18  
19    <properties>
20       <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
21       <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
22       <java.version>1.8</java.version>
23    </properties>
24  
25    <dependencies>
26       <dependency>
27          <groupId>org.springframework.boot</groupId>
28          <artifactId>spring-boot-starter-web</artifactId>
29       </dependency>
30  
31       <dependency>
32          <groupId>org.springframework.boot</groupId>
33          <artifactId>spring-boot-starter-test</artifactId>
34          <scope>test</scope>
35       </dependency>
36  
37       <dependency>
38          <groupId>org.springframework.boot</groupId>
39          <artifactId>spring-boot-starter-thymeleaf</artifactId>
40       </dependency>
41    </dependencies>
42  
43    <build>
44       <plugins>
45          <plugin>
46             <groupId>org.springframework.boot</groupId>
47             <artifactId>spring-boot-maven-plugin</artifactId>
48          </plugin>
49       </plugins>
50    </build>
51 </project>

Gradle – build.gradle

 1 buildscript {
 2    ext {
 3       springBootVersion = '1.5.8.RELEASE'
 4    }
 5    repositories {
 6       mavenCentral()
 7    }
 8    dependencies {
 9       classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
10    }
11 }
12 apply plugin: 'java'
13 apply plugin: 'eclipse'
14 apply plugin: 'org.springframework.boot'
15  
16 group = 'com.tutorialspoint'
17 version = '0.0.1-SNAPSHOT'
18 sourceCompatibility = 1.8
19  
20 repositories {
21    mavenCentral()
22 }
23 dependencies {
24    compile('org.springframework.boot:spring-boot-starter-web')
25    compile group: 'org.springframework.boot', name: 'spring-boot-starter-thymeleaf'
26    testCompile('org.springframework.boot:spring-boot-starter-test')
27 }
    主 Spring Boot 应用类文件如下:
 1 package com.tutorialspoint.demo;
 2  
 3 import org.springframework.boot.SpringApplication;
 4 import org.springframework.boot.autoconfigure.SpringBootApplication;
 5  
 6 @SpringBootApplication
 7 public class DemoApplication {
 8    public static void main(String[] args) {
 9       SpringApplication.run(DemoApplication.class, args);
10    }
11 }
   控制类文件如下:
 1 package com.tutorialspoint.demo.controller;
 2  
 3 import org.springframework.stereotype.Controller;
 4 import org.springframework.web.bind.annotation.RequestMapping;
 5  
 6 @Controller
 7 public class ViewController {
 8    @RequestMapping("/locale")
 9    public String locale() {
10       return "locale";
11    }
12 }
    支持国际化的配置类:
 1 package com.tutorialspoint.demo;
 2  
 3 import java.util.Locale;
 4  
 5 import org.springframework.context.annotation.Bean;
 6 import org.springframework.context.annotation.Configuration;
 7 import org.springframework.web.servlet.LocaleResolver;
 8 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 9 import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
10 import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
11 import org.springframework.web.servlet.i18n.SessionLocaleResolver;
12  
13 @Configuration
14 public class Internationalization extends WebMvcConfigurerAdapter {
15    @Bean
16    public LocaleResolver localeResolver() {
17       SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
18       sessionLocaleResolver.setDefaultLocale(Locale.US);
19       return sessionLocaleResolver;
20    }
21    @Bean
22    public LocaleChangeInterceptor localeChangeInterceptor() {
23       LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
24       localeChangeInterceptor.setParamName("language");
25       return localeChangeInterceptor;
26    }
27    @Override
28    public void addInterceptors(InterceptorRegistry registry) {
29       registry.addInterceptor(localeChangeInterceptor());
30    }
31 }
    消息源 – messages.properties 如下:
welcome.text = Hi Welcome to Everyone
    消息源 – message_fr.properties 文件如下:
welcome.text = Salut Bienvenue à tous
    HTML 文件 locale.html 应当放在 classpath 路径下的 templates 目录,如下所示:
 1 <!DOCTYPE html>
 2 <html>
 3    <head>
 4       <meta charset = "ISO-8859-1"/>
 5       <title>Internationalization</title>
 6    </head>
 7    <body>
 8       <h1 th:text = "#{welcome.text}"></h1>
 9    </body>
10 </html>
   使用 Maven 或 Gradle 命令创建可执行 JAR 文件并运行 Spring Boot 应用:
   Maven 命令如下:
mvn clean install
   在 “BUILD SUCCESS” 之后,你可以在 target 目录下找到 JAR 文件。
   Gradle 可以使用以下命令:
gradle clean build
   在 “BUILD SUCCESSFUL” 之后,你可以在 build/libs 目录下找到 JAR 文件。
   现在,使用以下命令运行 JAR 文件:
java –jar <JARFILE>
    应用已在 Tomcat 8080 端口启动,如下图所示:
    在浏览器输入 URL http://localhost:8080/locale 可以看到如下输出:
    URL http://localhost:8080/locale?language=fr 输出如下:
 
posted @ 2020-09-10 14:24  码者无疆  阅读(898)  评论(0)    收藏  举报