业务场景
项目中需要实现切换不用国家语言的功能,这边主要针对后端代码进行一个修改,主要改造的点:
- 后端返回给前端的提示
- @Valid 校验提示国际化
- 对需要返回给前端的实体表或者VO实体中含有需要切换语言的字段进行切换语言
这次主要针对1、2进行改造
实现步骤
1、首先在src/main/resources下面创建多语言资源文件
下面这张图创建对应的语言(要记住base name,之后application.yml中要用到)
创建好以后会得到下面这样的目录结构
2、配置application.yml,这边message下的basename是resources下路径+ / {basename}
3、在 Spring Boot 应用中配置 MessageSource
@Configuration
public class I18nConfig {
// 这边配置对应的
@Bean
public LocaleResolver localeResolver() {
AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
//设置默认中文
localeResolver.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);
return localeResolver;
}
}
4、如果需要 使用javax.validation包下的@Valid这个注解可以把上面代码替换成底下这块代码
@Configuration
public class I18nConfig implements WebMvcConfigurer {
@Autowired
private MessageSource messageSource;
@Bean
public LocaleResolver localeResolver() {
AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
//设置默认中文
localeResolver.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);
return localeResolver;
}
/**
* valid校验机制提示信息国际化设置
*/
@Bean
public LocalValidatorFactoryBean validatorFactoryBean(){
LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean();
localValidatorFactoryBean.setValidationMessageSource(messageSource);
return localValidatorFactoryBean;
}
@Override
public Validator getValidator() {
return validatorFactoryBean();
}
}
5、定一个枚举类用来存放多语言资源文件中的key(个人习惯这样做,也可以不用这个类,用这个类的好处是以后遇到重复的可以直接调用这个枚举,防止书写错误,对性能有一定的作用,代码看着也比较美观点)
/**
* 多语言字典
* 对应resources/i8n下的message资源包
* 这边都是文字就不一一列举注释可以去资源包中查看对应中文意思
*/
public enum I18nEnum {
TEST("test"),
TEST_2("test2"),
;
private String code;
I18nEnum(String code) {
this.code = code;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}
6、创建工具类
public class I18nMessageUtil {
private static Logger logger = LoggerFactory.getLogger(I18nMessageUtil.class);
/**
* 多语言字符串转换
* @param code 多语言表中对应的code
* @param args 参数
* @return 转换后的文字
*/
public static String getMessage(String code,Object... args){
MessageSource messageSource = SpringContextUtils.getBean(MessageSource.class);
try {
return messageSource.getMessage(code, args, LocaleContextHolder.getLocale());
}catch (NoSuchMessageException ex){
logger.error(code+"在多语言文件中不存在",ex);
return code;
}
}
/**
* 多语言字符串转换
* @param code
* @return 转换后的文字
*/
public static String getMessage(String code){
return getMessage(code,null);
}
/**
* 多语言字符串转换
* @param i18nEnum
* @return
*/
public static String getMessage(I18nEnum i18nEnum){
return getMessage(i18nEnum.getCode());
}
/**
* 多语言字符串转换
* @param i18nEnum
* @return
*/
public static String getMessage(I18nEnum i18nEnum,Object... args){
return getMessage(i18nEnum.getCode(),args);
}
}
7、实际使用很简单,就不多做演示
//代码中
I18nMessageUtil.getMessage(I18nEnum.TEST);
//使用@Valid时 用[}
@NotNull(message="{test}")
private String test;
上面这些做完,前端请求时,请求头要带上Accept-Language这个,然后值的话可以参考这个链接里面的值
链接: https://www.vmlogin.com.cn/help/basic-settings/global-language.html