Springboot国际化

1.pom文件引入springboot即可

2.application.yml

spring:
  messages:
    # 设置message文件基础前缀,即resources/i18n/messages_语言.properties
    basename: i18n/messages 
    encoding: UTF-8

3.在resources下新建文件

messages_en_US.properties:

a018615b35588a01=hello world
e3b1e79e548cc398=hello world, {0}

messages_zh_CN.properties:

a018615b35588a01=你好,世界
e3b1e79e548cc398=你好,世界, {0}

在这里插入图片描述

4.自定义语言解析器

/**
 * Locale解析器,默认解析器为AcceptHeaderLocaleResolver,拦截Accept-Language请求头
 * 这自定义拦截Language请求头
 */
public class LanguageLocaleResolver extends AbstractLocaleResolver {
    @Override
    public Locale resolveLocale(HttpServletRequest request) {
        String language = request.getHeader("Language");
        if(language != null){
            return StringUtils.parseLocale(language);
        }else{
            return Locale.getDefault();
        }
    }

    @Override
    public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {

    }
}

5.配置

@Configuration
public class MessageSourceConfig {
 
    @Bean(name = "messageSource")
    public ResourceBundleMessageSource getMessageSource() throws Exception {
        ResourceBundleMessageSource resourceBundleMessageSource = new ResourceBundleMessageSource();
        resourceBundleMessageSource.setDefaultEncoding("UTF-8");
        resourceBundleMessageSource.setBasenames("i18n/messages");
        return resourceBundleMessageSource;
    }

   @Bean("localeResolver")
    public LocaleResolver localeResolver(){
        return new LanguageLocaleResolver();
    }
}

6.国际化工具类

@Slf4j
@Component
public class I18NUtils {

    public static final List<String> LOCALES = List.of("zh_CN", "en_US");

    private static MessageSource messageSource;
    
    // 这里使用md5生成key,可自行使用其他hash算法生成唯一的key
    private static final MD5 md5 = MD5.create();

    public I18NUtils(MessageSource messageSource) {
        I18NUtils.messageSource = messageSource;
    }

    public static String getByCh(String message) {
        String key = md5.digestHex16(message);
        String i18n = null;
        try {
            i18n = messageSource.getMessage(key, null, LocaleContextHolder.getLocale());
        } catch (Exception ex) {
            log.warn("[I18NUtils]WithoutArg:{}|{}", key, ex.getMessage());
        }
        return i18n;
    }

    public static String getCustomLocaleByCh(String message, Locale locale) {
        String key = md5.digestHex16(message);
        String i18n = null;
        try {
            i18n = messageSource.getMessage(key, null, locale);
        } catch (Exception ex) {
            log.error("[I18NUtils]WithoutArgWithLocale:{}", ex.getMessage());
        }
        return i18n;
    }

    public static String getByCh(String message, Object... arg) {
        String key = md5.digestHex16(message);
        String i18n = null;
        try {
            i18n = messageSource.getMessage(key, arg, LocaleContextHolder.getLocale());
        } catch (Exception ex) {
            log.error("[I18NUtils]WithoutArg:{}", ex.getMessage());
        }
        return i18n;
    }
}

7.测试

@CrossOrigin("*")
@RestController
@RequestMapping("/locale")
public class LocaleController {

    @GetMapping("/test")
    public String test(){
        Locale locale = LocaleContextHolder.getLocale();
        System.out.println(locale.getLanguage());
        return I18NUtils.getByCh("你好,世界");
    }

    @GetMapping("/test2")
    public String test2(){
        Locale locale = LocaleContextHolder.getLocale();
        System.out.println(locale.getLanguage());
        return I18NUtils.getByCh("你好,世界, {0}", "你大爷");
    }
}

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值