SpringMVC的国际化
WebMVC的核心LocaleResolver,MessageSource。
WebMvcAutoConfiguration 是SpringBoot中的 Web方面的自动配置类。
在MVC的配置类里面,如果没有自定义的LocaleResolver,那么就会使用默认的。并且自定义的名称是"localeResolver",才不会加载默认的。
默认使用的是AcceptHeaderLocaleResolver,这个类会从请求头里面获取Locale,如果没有,就使用默认的。
java
@Override
@Bean
@ConditionalOnMissingBean(name = DispatcherServlet.LOCALE_RESOLVER_BEAN_NAME)
public LocaleResolver localeResolver() {
if (this.webProperties.getLocaleResolver() == WebProperties.LocaleResolver.FIXED) {
return new FixedLocaleResolver(this.webProperties.getLocale());
}
AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
localeResolver.setDefaultLocale(this.webProperties.getLocale());
return localeResolver;
}
@ConfigurationProperties("spring.web")
public class WebProperties {
private Locale locale;
private LocaleResolver localeResolver = LocaleResolver.ACCEPT_HEADER;
private final Resources resources = new Resources();
}
-
默认的LocaleResolver
不需要更改,需要在请求头里面添加的Accept-Language属性。
-
自定义的LocaleResolver
需要从自定义的报文里面获取对应属性,就需要自定义LocaleResolver,获取报文属性里面的特定字段。
自定义实现国际化
- 自定义的LocaleResolver、MessageSource、Validator添加国际化功能
java
@Configuration
public class LocaleWebMvcConfigurer implements WebMvcConfigurer {
@Value("${spring.messages.basename:[]}")
private String[] basename;
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource =
new ReloadableResourceBundleMessageSource();
List<String> baseNames = new ArrayList<>();
baseNames.add("classpath:i18n/validation/messages");
Optional.ofNullable(basename).ifPresent(path -> {
baseNames.addAll(Arrays.asList(path));
});
messageSource.setBasenames(baseNames.toArray(new String[0]));
messageSource.setDefaultEncoding(StandardCharsets.UTF_8.name());
return messageSource;
}
@Override
public Validator getValidator() {
return validator();
}
@Bean
public Validator validator() {
LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
validator.setValidationMessageSource(messageSource());
return validator;
}
@Bean
public LocaleResolver localeResolver() {
return new CustomLocaleResolver();
}
private static class CustomLocaleResolver implements LocaleResolver {
@Override
public Locale resolveLocale(HttpServletRequest request) {
String[] locales = Optional.ofNullable((String) FlowRuntimeContext.getTechProperty("LOCALE")).orElse(Locale.getDefault().toString()).split("_");
return new Locale(locales[0], locales[1]);
}
@Override
public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
}
}
}
-
指定类路径下添加语言包message.properties,message_zh_CN.properties,message_en_US.properties,message_zh_TW.properties
-
使用MessageSource获取对应的message
messageSource.getMessage(String code, @Nullable Object[] args, Locale locale);