Spring Boot 教程:國(guó)際化
【注】本文譯自: https://www.tutorialspoint.com/spring_boot/spring_boot_internationalization.htm

? ? 國(guó)際化是一種處理機(jī)制,使得你的應(yīng)用可以適配不同的語(yǔ)言和區(qū)域而無(wú)需更改源代碼。換言之,國(guó)際化是為本地化而準(zhǔn)備。
? ? 本文將帶你學(xué)習(xí)在?Spring Boot 中如何實(shí)現(xiàn)國(guó)際化的細(xì)節(jié)。
依賴
? ? 在?Spring Boot 中開(kāi)發(fā) web 應(yīng)用,我們需要依賴?Spring Boot Starter Web 和 Spring Boot Starter Thymeleaf 依賴項(xiàng)。
Maven
<dependency>
???<groupId>org.springframework.boot</groupId>
???<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
???<groupId>org.springframework.boot</groupId>
???<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
Gradle
compile('org.springframework.boot:spring-boot-starter-web')
compile?group:?'org.springframework.boot',?name:?'spring-boot-starter-thymeleaf'
LocaleResolver
? ? 要確定你的應(yīng)用的缺省本地化,需要在 Spring Boot 應(yīng)用中 增加?LocaleResolver bean。
@Bean
public?LocaleResolver?localeResolver()?{
???SessionLocaleResolver?sessionLocaleResolver?=?new?SessionLocaleResolver();
???sessionLocaleResolver.setDefaultLocale(Locale.US);
???return?sessionLocaleResolver;
}
LocaleChangeInterceptor
? ??LocaleChangeInterceptor 用于根據(jù)請(qǐng)求所帶的語(yǔ)言參數(shù)來(lái)切換新的本地化。
@Bean
public?LocaleChangeInterceptor?localeChangeInterceptor()?{
???LocaleChangeInterceptor?localeChangeInterceptor?=?new?LocaleChangeInterceptor();
???localeChangeInterceptor.setParamName("language");
???return?localeChangeInterceptor;
}
? ? 要把?LocaleChangeInterceptor 加到應(yīng)用注冊(cè)攔截器中才能生效。這個(gè)配置類應(yīng)當(dāng)繼承 WebMvcConfigurerAdapter 類且重載 addInterceptors() 方法。
@Override
public?void?addInterceptors(InterceptorRegistry?registry)?{
???registry.addInterceptor(localeChangeInterceptor());
}
消息資源
? ??Spring Boot 應(yīng)用默認(rèn)從?classpath 路徑下的?src/main/resources?文件夾獲取消息源。缺省本地化消息文件名應(yīng)當(dāng)是?message.properties,每個(gè)本地化文件名應(yīng)當(dāng)類似??messages_XX.properties。“XX” 代表本地化代號(hào)。
? ??所有的消息屬性應(yīng)當(dāng)以鍵值方式表達(dá)。如果任意屬性沒(méi)有在本地化中找到,應(yīng)用就從 messages.properties 文件中獲取缺省值。
? ? 缺省?messages.properties?如下所示:
welcome.text=Hi Welcome to Everyone
? ? 法語(yǔ)?messages_cn.properties 如下所示:
welcome.text=Salut Bienvenue à tous
注意:消息源文件應(yīng)當(dāng)以 “UTF-8” 格式存儲(chǔ)。
HTML 文件
? ??在 HTML 文件中,使用?#{key}?語(yǔ)法來(lái)顯示屬性文件中獲取的消息。
<h1 th:text = "#{welcome.text}"></h1>
? ??完整的代碼如下:
Maven – pom.xml
<?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>
???<groupId>com.tutorialspoint</groupId>
???<artifactId>demo</artifactId>
???<version>0.0.1-SNAPSHOT</version>
???<packaging>jar</packaging>
???<name>demo</name>
???<description>Demo?project?for?Spring?Boot</description>
???<parent>
??????<groupId>org.springframework.boot</groupId>
??????<artifactId>spring-boot-starter-parent</artifactId>
??????<version>1.5.8.RELEASE</version>
??????<relativePath?/>
???</parent>
???<properties>
??????<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
??????<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
??????<java.version>1.8</java.version>
???</properties>
???<dependencies>
??????<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>
??????<dependency>
?????????<groupId>org.springframework.boot</groupId>
?????????<artifactId>spring-boot-starter-thymeleaf</artifactId>
??????</dependency>
???</dependencies>
???<build>
??????<plugins>
?????????<plugin>
????????????<groupId>org.springframework.boot</groupId>
????????????<artifactId>spring-boot-maven-plugin</artifactId>
?????????</plugin>
??????</plugins>
???</build>
</project>
Gradle – build.gradle
buildscript?{
???ext?{
??????springBootVersion?=?'1.5.8.RELEASE'
???}
???repositories?{
??????mavenCentral()
???}
???dependencies?{
??????classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
???}
}
apply?plugin:?'java'
apply?plugin:?'eclipse'
apply?plugin:?'org.springframework.boot'
group?=?'com.tutorialspoint'
version?=?'0.0.1-SNAPSHOT'
sourceCompatibility?=?1.8
repositories?{
???mavenCentral()
}
dependencies?{
???compile('org.springframework.boot:spring-boot-starter-web')
???compile?group:?'org.springframework.boot',?name:?'spring-boot-starter-thymeleaf'
???testCompile('org.springframework.boot:spring-boot-starter-test')
}
? ??主 Spring Boot 應(yīng)用類文件如下:
package?com.tutorialspoint.demo;
import?org.springframework.boot.SpringApplication;
import?org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public?class?DemoApplication?{
???public?static?void?main(String[]?args)?{
??????SpringApplication.run(DemoApplication.class,?args);
???}
}
? ?控制類文件如下:
package?com.tutorialspoint.demo.controller;
import?org.springframework.stereotype.Controller;
import?org.springframework.web.bind.annotation.RequestMapping;
@Controller
public?class?ViewController?{
???@RequestMapping("/locale")
???public?String?locale()?{
??????return?"locale";
???}
}
? ? 支持國(guó)際化的配置類:
package?com.tutorialspoint.demo;
import?java.util.Locale;
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;
@Configuration
public?class?Internationalization?extends?WebMvcConfigurerAdapter?{
???@Bean
???public?LocaleResolver?localeResolver()?{
??????SessionLocaleResolver?sessionLocaleResolver?=?new?SessionLocaleResolver();
??????sessionLocaleResolver.setDefaultLocale(Locale.US);
??????return?sessionLocaleResolver;
???}
???@Bean
???public?LocaleChangeInterceptor?localeChangeInterceptor()?{
??????LocaleChangeInterceptor?localeChangeInterceptor?=?new?LocaleChangeInterceptor();
??????localeChangeInterceptor.setParamName("language");
??????return?localeChangeInterceptor;
???}
???@Override
???public?void?addInterceptors(InterceptorRegistry?registry)?{
??????registry.addInterceptor(localeChangeInterceptor());
???}
}
? ??消息源 – messages.properties 如下:
welcome.text = Hi Welcome to Everyone
? ??消息源 – message_fr.properties 文件如下:
welcome.text = Salut Bienvenue à tous
? ??HTML 文件 locale.html 應(yīng)當(dāng)放在 classpath 路徑下的 templates 目錄,如下所示:
<!DOCTYPE?html>
<html>
???<head>
??????<meta?charset?=?"ISO-8859-1"/>
??????<title>Internationalization</title>
???</head>
???<body>
??????<h1?th:text?=?"#{welcome.text}"></h1>
???</body>
</html>
? ?使用 Maven 或 Gradle 命令創(chuàng)建可執(zhí)行?JAR 文件并運(yùn)行

Spring Boot 應(yīng)用:
? ?Maven 命令如下:
mvn clean install
? ?在 “BUILD SUCCESS” 之后,你可以在 target 目錄下找到 JAR 文件。
? ?Gradle 可以使用以下命令:
gradle clean build
? ?在 “BUILD SUCCESSFUL” 之后,你可以在?build/libs 目錄下找到?JAR 文件。
? ?現(xiàn)在,使用以下命令運(yùn)行 JAR 文件:
java –jar <JARFILE>
? ? 應(yīng)用已在?Tomcat 8080 端口啟動(dòng),如下圖所示:

? ? 在瀏覽器輸入 URL?http://localhost:8080/locale?可以看到如下輸出:

? ??URL?http://localhost:8080/locale?language=fr?輸出如下:
