一、Spring时代实现国际化步骤
(1)编写国际化配置文件
(2)使用 ResourceBundleMessageSource 管理国际化资源文件
(3)在页面使用 fmt:message 取出国际化内容
二、Spring Boot中的国际化实现
(1)编写国际化配置文件
如图所示,在/resources目录下创建i18n文件夹,在该文件夹下创建以.properties结尾的配置文件。以中英文切换为例:在i18n目录下创建index.properties(默认语言)、index_zh_CN.properties(中文),此时,系统会自动识别到是配置国际化,就会切换到国际化视图,可以右键 Resource Bundle ‘index’——Add——Add Propertie Files To Resource Bundle 快速添加其他国际化文件index_en_US.proerties(英语)。
此时实现的国际化配置是半自动的,它需要通过手动调整浏览器的语言而实现国际化。
以goole浏览器为例,它需要依次点击设置——高级,找到语言,手动设置网页语言选项。
(2)实现点击链接切换语言
在html页面使用超链接传递参数:
<a class="btn btn-sm" th:href="@{/index.html(lang='zh_CN')}">中文</a>
<a class="btn btn-sm" th:href="@{/index.html(lang='en_US')}">English</a>
自定义国际化语言解释器,获取在链接上携带的国际化区域信息:
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.LocaleResolver;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale;
public class MyLocaleResolver implements LocaleResolver {
@Override
public Locale resolveLocale(HttpServletRequest request) {
String language = request.getParameter("lang");
Locale locale = Locale.getDefault();
if(!StringUtils.isEmpty(language)){
String[] split = language.split("_");
/* param0:语言代码 param1:国家代码 */
locale = new Locale(split[0],split[1]);
}
return locale;
}
@Override
public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {
}
}
注册我们自己的国际化语言组件:
import com.zm.webrestfulcrud.component.MyLocaleResolver;
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.WebMvcConfigurer;
//放置各种组件的容器
@Configuration
public class MyConfig implements WebMvcConfigurer{
@Bean
public LocaleResolver localeResolver(){
return new MyLocaleResolver();
}
}
在application.properties文件中设置basename的值:
spring.messages.basename=i18n.index
三、Spring Boot 2.x国际化实现原理
(1).查看MessageSourceAutoConfiguration类,Spring Boot默认自动已经配置好了管理国际化资源文件的组件
@Bean
@ConfigurationProperties(prefix = "spring.messages")
public class MessageSourceAutoConfiguration {
private String basename = "messages";
}
默认配置文件为messages,所以,我们的配置文件可以直接放在类路径下叫messages.properties。
(2)查看该类下的MessageSource 方法
@Bean
public MessageSource messageSource(MessageSourceProperties properties) {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
if (StringUtils.hasText(properties.getBasename())) {
//设置国际化资源文件的基础名(去掉语言——国家代码后的文件名)
messageSource.setBasenames(StringUtils.commaDelimitedListToStringArray(StringUtils.trimAllWhitespace(properties.getBasename())));
}
if (properties.getEncoding() != null) {
messageSource.setDefaultEncoding(properties.getEncoding().name());
}
messageSource.setFallbackToSystemLocale(properties.isFallbackToSystemLocale());
Duration cacheDuration = properties.getCacheDuration();
if (cacheDuration != null) {
messageSource.setCacheMillis(cacheDuration.toMillis());
}
messageSource.setAlwaysUseMessageFormat(properties.isAlwaysUseMessageFormat());
messageSource.setUseCodeAsDefaultMessage(properties.isUseCodeAsDefaultMessage());
return messageSource;
}
该方法使用了springMVC的ResourceBundleMessageSource,通过该方法设置国际化资源文件的基础名(去掉语言国家代码),如果基础名不为根路径下的messages.properties就需要手动添加自定义的基础名,如果有多个就用逗号分隔。
在application.properties配置文件中进行国际化配置文件的设置:
# 国际化基础路径目录的设置
spring.messages.basename=i18n.xxxx