spring boot-10.国际化
1.在原来spring MVC 中国际化实现步骤
(1)编写国际化配置文件
(2)使用ResourceBundleMessageSource管理国际化资源文件
(3)在页面中取国际化信息
2.spring boot实现
spring boot 默认为我们配置了 ResourceBundleMessageSource。org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration 为我们提供了国际化的自动配置。
@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; }
其中指定了默认的国际化资源配置文件是类路径下的messages.properties。我们可以在全局配置文件中修改国际化配置文件的名称,例如指定国际化配置文件为类路径下的i18n下的login.properties
spring.messages.basename=i18n.login
当然国际化配置文件可以根据国家和语言信息来指定,如果当前浏览器环境 的语言信息没有匹配的国际化配置文件,就读取默认的国际化配置文件。例如编写了三个国际化配置文件,分别为login_en_US.properties,login_zh_CN.properties,login.properties,分别对应英文环境,中文环境,默认环境。
3.页面输出国际化信息
jsp:通过fmt:message
freemaker:<@spring.message code="loginFrom.username"/>
themleaf:#{message.password}
4.实现效果
4.自定义区域信息解析器
@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; }
以上是org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration 中关于区域信息解析器的配置,可以看到注解,@ConditionalOnMissingBean是在容器中没有LocaleResolver 时才生效,所有我们可以实现自己的区域信息解析器,并将它添加到容器中。可以通过在全局配置文件中配置spring.mvc来添加,或者在@Configuration配置类中通过@Bean来添加自定义的区域信息解析器。
(1)实现自己的区域信息解析器
public class MylocalResolver implements LocaleResolver{ @Override public Locale resolveLocale(HttpServletRequest request) { // TODO Auto-generated method stub Locale locale = Locale.getDefault(); String local =request.getParameter("local"); System.out.println("====="+local); if(!StringUtils.isEmpty(local)) { locale = new Locale(local.split("_")[0], local.split("_")[1]); } return locale; } @Override public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) { // TODO Auto-generated method stub } }
(2)添加进容器
@Configuration public class MyMVCcCConfig extends WebMvcConfigurerAdapter{ @Bean public LocaleResolver localeResolver() { return new MylocalResolver(); } }