在spring中提供了一个接口MessageSource来实现国际化。springboot中已经对国际化做了自动配置,自动配置MessageSourceAutoConfiguration,接下来我们看一下该类。
@Bean
@ConfigurationProperties(prefix = "spring.messages")
public MessageSourceProperties messageSourceProperties() {
return new MessageSourceProperties();
}
其中有这一段代码,@ConfigurationProperties(prefix = “spring.messages”)表示从你的配置文件(application.properties或application.yml)中获取信息。
再进入MessageSourceProperties这个类中
public class MessageSourceProperties {
/**
* Comma-separated list of basenames (essentially a fully-qualified classpath
* location), each following the ResourceBundle convention with relaxed support for
* slash based locations. If it doesn't contain a package qualifier (such as
* "org.mypackage"), it will be resolved from the classpath root.
*/
private String basename = "messages";
/**
* Message bundles encoding.
*/
private Charset encoding = StandardCharsets.UTF_8;
}
- basename 指定了国际化文件存放的位置。如果没有具体指定,则存放在类的根路径
- encoding 指定了文件所用编码,默认为UTF-8
所以我们可以通过设置basename和encoding的值来设置国际化文件存放的位置和编码类型。
在项目中建立国际化文件。
我放在了根目录的i18n文件夹下。
在配置文件中指定basename。
spring.messages.basename=i18n.login
这样我们就可以从国际化资源文件中获取信息了。
那么我们又是怎样实现切换页面的语言的呢?
在MessageSourceAutoConfiguration这个类中有这样一个方法。
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = "spring.mvc", name = "locale")
public LocaleResolver localeResolver() {
if (this.mvcProperties.getLocaleResolver() == WebMvcProperties.LocaleResolver.FIXED) {
return new FixedLocaleResolver(this.mvcProperties.getLocale());
}
AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
localeResolver.setDefaultLocale(this.mvcProperties.getLocale());
return localeResolver;
}
当缺少LocaleResolver 这个 Bean的时候,则从项目配置文件中读取spring.mvc.locale 获取语言。所以我们可以自定义一个类,实现LocaleResolver接口,来返回语言信息。
MyLocaleResolver 类
public class MyLocaleResolver implements LocaleResolver {
public MyLocalResolver() {
}
@Override
public Locale resolveLocale(HttpServletRequest request) {
String language = request.getParameter("language");
Locale locale = Locale.getDefault();
if (!StringUtils.isEmpty(language)) {
if (language.contains("CN"))
locale = Locale.CHINA;
else
locale = Locale.US;
}
return locale;
}
@Override
public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {
}
}
login.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body class="text-center">
<a th:href="@{/index.html(language='zh_CN')}">中文</a>
<a th:href="@{/index.html(language='en_US')}">English</a>
</body>
</html>
在MyLocaleResolver 类中,通过request获取请求中的参数language,来判断用哪种语言。这样就可以实现页面语言的切换了。