一、springmvc国际化步骤
1)、编写国际化配置文件;
2)、使用ResourceBundleMessageSource管理国际化资源文件
3)、在页面使用fmt:message取出国际化内容
二、springboot国际化步骤
1、编写国际化配置文件,抽取页面需要显示的国际化消息
(1)建立配置文件
(2)配置配置文件
2、SpringBoot自动配置好了管理国际化资源文件的组件
源码中:国际化获取国际化文件名称时是按this.basename
获取的,而默认了国际化配置文件的基础名称为message,所以我们的配置文件可以有两种方式:
(1)直接放在类路径下叫messages.properties;
(2)按照自己的配置文件,再在配置文件中配置国际化的名称。例如:
spring.messages.basename=i18n.login
@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";
@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;
}
3、在页面获取国际化的值
国际化原理:
如果配置了区域信息,去mvcProperties中获取locale的映射信息,按配置文件信息最后返回到localeResolver中。如果没有配置,则会根据AcceptHeaderLocaleResolver中的request.header()获取请求头中的区域信息
国际化Locale(区域信息对象);LocaleResolver(获取区域信息对象);
@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;
}
对于点击转换语言,我们可以在url中携带locale信息,并自定义区域解析器获取请求头中的区域信息,并返回区域信息。
public class MyLocaleResolver implements LocaleResolver {
@Override
public Locale resolveLocale(HttpServletRequest httpServletRequest) {
String language = httpServletRequest.getParameter("l");
Locale locale = Locale.getDefault();
if (!StringUtils.isEmpty(language)){
String[] s = language.split("_");
locale = new Locale(s[0], s[1]);
}
return locale;
配置到Springboot容器中
此处需要注意的是LocaleResolver需要命名为localeResolver,因为bean的id就是方法名,否则会出现识别不到的情况。
@Bean
public LocaleResolver localeResolver(){
return new MyLocaleResolver();
}