这里省去搭建项目步骤。
第一步:创建国际化文件
login.btn=登录
login.password=密码
login.remember=记住我
login.tip=请登录
login.username=用户名
login.btn=Sign in
login.password=Password
login.remember=Remember me
login.tip=Please sign in
login.username=Username
第二步:配置国际化文件位置
application.properties
spring.messages.basename=i18n.login
第三步:自定义国际化解析器
public class MyLocaleResolver implements LocaleResolver {
@Override
public Locale resolveLocale(HttpServletRequest httpServletRequest) {
// 从参数中取l的值作为语言和国家代码
String paramLanguage = httpServletRequest.getParameter("l");
if(!StringUtils.isEmpty(paramLanguage)){
String[] splits = paramLanguage.split("-");
return new Locale(splits[0], splits[1]);
}else{
// 从请求头中取Accept-Language的首个语言和国家代码
String acceptLanguage = httpServletRequest.getHeader("Accept-Language").split(",")[0];
String[] splits = acceptLanguage.split("-");
return new Locale(splits[0], splits[1]);
}
// 如果想使用当前系统的语言,则使用Locale.getDefault()
}
@Override
public void setLocale(HttpServletRequest httpServletRequest, @Nullable HttpServletResponse httpServletResponse, @Nullable Locale locale) {
}
}
注意:在SpringBoot中,自动配置好了管理国际化资源文件的组件MessageSourceAutoConfiguration
@ConfigurationProperties(prefix = "spring.messages")
public class MessageSourceAutoConfiguration {
/**
* 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";
//我们的配置文件可以直接放在类路径下叫messages.properties;
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
if (StringUtils.hasText(this.basename)) {
//设置国际化资源文件的基础名(去掉语言国家代码的)
messageSource.setBasenames(StringUtils.commaDelimitedListToStringArray(
StringUtils.trimAllWhitespace(this.basename)));
}
if (this.encoding != null) {
messageSource.setDefaultEncoding(this.encoding.name());
}
messageSource.setFallbackToSystemLocale(this.fallbackToSystemLocale);
messageSource.setCacheSeconds(this.cacheSeconds);
messageSource.setAlwaysUseMessageFormat(this.alwaysUseMessageFormat);
return messageSource;
}
第四步:将自定义国际化解析器加入容器
@Configuration
public class MyMvcConfigurer implements WebMvcConfigurer {
@Bean
public LocaleResolver localeResolver(){
return new MyLocaleResolver();
}
}
第五步:在页面中使用方式,我这里是使用了Tymeleaf语法,使用普通html语法也一样
<h1 th:text="#{login.tip}">Please sign in</h1>
<a th:href="@{/login.html(l='zh-CN')}">中文</a>
<a th:href="@{/login.html(l='en-US')}">English</a>