SpringBoot-国际化
- SpringBoot自动配置了消息资源
@Configuration(proxyBeanMethods = false)
@ConditionalOnMissingBean(name = AbstractApplicationContext.MESSAGE_SOURCE_BEAN_NAME, search = SearchStrategy.CURRENT)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
@Conditional(ResourceBundleCondition.class)
@EnableConfigurationProperties
public class MessageSourceAutoConfiguration {
private static final Resource[] NO_RESOURCES = {};
@Bean
@ConfigurationProperties(prefix = "spring.messages")
public MessageSourceProperties messageSourceProperties() {
return new MessageSourceProperties();
}
@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;
}
}
- 配置国际化拦截器解析器
@Configuration(proxyBeanMethods = true)
//@ServletComponentScan("com.zjstart") //启用监听器过滤器的支持
public class WebMVCConfig implements WebMvcConfigurer {
/**
* 配置国际化拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LocaleChangeInterceptor());
}
/**
* 配置国际化解析器
* @return
*/
@Bean("localeResolver")
public CookieLocaleResolver localeResolver(){
return new CookieLocaleResolver();
}
}
- 配置语言切换文件
1.基础文件必须配置 messages.properties 否则报错
2.messages_en_US.properties
login=Login
3.messages_zh_CN.properties
login=登录
- 测试
<!--通过locale实现语言切换 默认为拦截器LocaleChangeInterceptor中设置,可以自己修改-->
<a href="?locale=zh_CN">中文</a>
<a href="?locale=en_US">英文</a>
<p>国际化配置:<span th:text="#{login}"></span></p>
- 语言拦截器
public class LocaleChangeInterceptor implements HandlerInterceptor {
/**
* Default name of the locale specification parameter: "locale".
*/
public static final String DEFAULT_PARAM_NAME = "locale";
protected final Log logger = LogFactory.getLog(getClass());
private String paramName = DEFAULT_PARAM_NAME;
}