-
编写多语言文件
-
配置
@Bean("filedNameMessage")
public MessageSource messageSource(){
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("i18n/filedNameMessage");
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
filedNameMessage.getMessage("name",null, LocaleContextHolder.getLocale());
- 自定义识别请求头字段
/**
* 获取自定义header表示,修改locale信息
默认根据请求头中Accept-Language字段判断
修改为根据请求头中lang字段判断
*/
@Bean
public LocaleResolver localeResolver() {
return new I18nLocaleResolver();
}
static class I18nLocaleResolver implements LocaleResolver {
@Override
public Locale resolveLocale(HttpServletRequest httpServletRequest) {
String language = httpServletRequest.getHeader("lang");
Locale locale = Locale.getDefault();
if (StrUtil.isNotBlank(language)) {
if (language.contains("_")) {
String[] split = language.split("_");
locale = new Locale(split[0], split[1]);
} else {
locale = new Locale(language, "");
}
}
return locale;
}
@Override
public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
Locale locale) {
}
}
- Validated校验,国际化
- 如果配置了国际化,那么Validated校验默认消息也会自动添加国际化。
- 如果使用自定义的国际化,还需要进行配置
重写WebMvcConfigurer中方法
@Override
public Validator getValidator() {
LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean();
localValidatorFactoryBean.setValidationMessageSource(messageSource());
return localValidatorFactoryBean;
}
例子
国际化文件中
namelimit=姓名字符个数在{min}-{max}之间
校验字段
@Size(min = 1,max = 3,message = "{namelimit}")
private String name;
会提示 姓名字符个数在1-3之间
- 请求参数中识别多语言字段
默认是在请求头中识别 多语言字段的,如果需要在请求参数中使用
例如 http://localhost/test/test2?lang=cn_zh, 需要进行如下配置
//配置拦截器
@Bean
public LocaleChangeInterceptor localeChangeInterceptor(){
LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
localeChangeInterceptor.setParamName("lang");
return localeChangeInterceptor;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}