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 输出如下:


浙公网安备 33010602011771号