Spring Boot - 国际化
Spring Boot通过使用MessageSource
接口支持国际化,让你能够为不同的地区和语言提供本地化的应用版本。下面是一个完整的流程,展示如何在Spring Boot应用中实现国际化。
# 1. 创建资源文件
首先,在src/main/resources
目录下创建国际化资源文件。这些文件包含了应用中使用的所有国际化消息,遵循messages_语言代码_国家代码.properties
的命名约定。例如:
messages.properties
:默认资源文件,应用在没有找到匹配的语言和国家代码时使用此文件。messages_zh_CN.properties
:为中文用户定制的资源文件。messages_en_US.properties
:为美国英语用户定制的资源文件。
示例资源文件内容
messages.properties(默认资源文件)
这是默认的资源文件,如果Spring Boot找不到与请求的Locale
匹配的资源文件,就会回退到使用这个文件。假设您的应用主要语言是英文,可以像这样编写:
welcome.message=Welcome to Our Application!
login.message=Please login to continue.
2
messages_zh_CN.properties(中文资源文件)
这个文件包含了中文(简体)的翻译。文件名的zh_CN
部分指的是语言代码zh
(中文)和国家代码CN
(中国):
welcome.message=欢迎来到我们的应用!
login.message=请登录以继续。
2
messages_en_US.properties(美国英语资源文件)
虽然这个文件可能与默认资源文件非常相似,但在某些情况下,您可能希望对美国用户使用略有不同的表达方式。例如:
welcome.message=Welcome to Our Application, y'all!
login.message=Please log in to continue.
2
# 2. 配置MessageSource Bean
在Spring配置类中定义MessageSource
Bean,设置资源文件的基本名(basename)和默认编码。
@Configuration
public class InternationalizationConfig {
// 配置国际化消息源
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
// 设置资源文件的基本名(不带语言代码和国家代码的部分)
messageSource.setBasename("messages");
// 设置默认字符编码
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
ResourceBundleMessageSource
是MessageSource
接口的实现,用于基于资源束(一系列属性文件)解析消息,支持国际化。messageSource.setBasename("messages")
:指示ResourceBundleMessageSource
查找所有前缀为"messages"的属性文件(如messages.properties
,messages_en_US.properties
等)。这是定位不同语言和地区的消息文件的基础。
# 3. 使用MessageSource获取消息
在Controller中,通过自动注入MessageSource
Bean来获取国际化消息,并响应给客户端。
@RestController
public class WelcomeController {
@Autowired
private MessageSource messageSource;
// 处理/welcome请求
@GetMapping("/welcome")
public String welcome(HttpServletRequest request) {
// 获取请求的Locale
Locale locale = request.getLocale();
// 获取国际化消息
String welcomeMessage = messageSource.getMessage("welcome.message", null, locale);
return welcomeMessage;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 4. 在Thymeleaf模板中使用国际化消息
如果你使用Thymeleaf作为模板引擎,可以直接在模板中引用国际化消息。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title th:text="#{welcome.title}">Welcome Page</title>
</head>
<body>
<h1 th:text="#{welcome.message}">Welcome Message</h1>
<p th:text="#{login.message}">Login Message</p>
</body>
</html>
2
3
4
5
6
7
8
9
10
11
# 5. 切换语言
你可以通过改变请求的Accept-Language
头部或通过特定参数来切换语言。Spring MVC提供了LocaleChangeInterceptor
拦截器,可以帮助在每次请求时根据参数或者头部信息来改变Locale
。
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
// 添加拦截器配置
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 创建Locale更改拦截器
LocaleChangeInterceptor localeInterceptor = new LocaleChangeInterceptor();
// 设置请求参数名
localeInterceptor.setParamName("lang");
// 注册拦截器
registry.addInterceptor(localeInterceptor);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
通过添加?lang=zh_CN
到URL,用户可以切换到中文界面。
# 6. 自动根据浏览器设置选择语言
你还可以配置LocaleResolver
,让Spring Boot自动根据浏览器的语言设置选择合适的语言版本。
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
sessionLocaleResolver.setDefaultLocale(Locale.US); // 设置默认Locale
return sessionLocaleResolver;
}
}
2
3
4
5
6
7
8
9
10
# 7. 总结
Spring Boot的国际化支持使得为不同地区和语言的用户提供本地化应用变得简单。通过定义国际化资源文件、使用MessageSource
以及配置LocaleResolver
和LocaleChangeInterceptor
,你可以轻松实现和管理应用的国际化。