springboot 使用i18n实现国际化(一)

springboot 使用i18n实现国际化(一)

业务场景

项目中需要实现切换不用国家语言的功能,这边主要针对后端代码进行一个修改,主要改造的点:

  1. 后端返回给前端的提示
  2. @Valid 校验提示国际化
  3. 对需要返回给前端的实体表或者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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值