springboot国际化配置

1,116 阅读2分钟

是 en_US 还是 en-US

做多语言的时候,语言对应的 code 应该写成 en_US 形式还是 en-US 形式?我查阅了一番,发现有两种标准。

第一个是互联网工程任务组(IETF)出的 RFC5646,用的是中划线 en-US。既然是互联网相关,所以 HTTP 中的 Accept-Language 写法就是中划线

Accept-Language: fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5

第二个是跟工商业相关的 ISO(国际标准化组织)制定的 ISO/IEC 15897 标准,其中提到了 POSIX Locales,用的是下划线,因此所有兼容 POSIX 的计算机操作系统当然用的就是这个标准,比如 Linux 终端中的变量

LANG=cs_CZ.UTF-8
LC_CTYPE="cs_CZ.UTF-8"

那么我们做 i18n 时应该选哪一种?答案是看情况,比如这里就有一个争论。我建议你看著名的项目用什么标准,你就用什么标准,各种编程语言不尽相同。AntD 用的就是下划线,所以前端项目可以用下划线。

基本使用

Spring Boot 国际化踩坑指南 juejin.cn/post/684490…

自定义headers传递国际化参数

(1)自定义重写 LocaleResolver 类的 resolveLocale 方法,代码如下:

public class MyLocaleResolverConfig implements LocaleResolver {

    private static final String PATH_PARAMETER = "lang";

    private static final String PATH_PARAMETER_SPLIT = "_";

    @Override
    public Locale resolveLocale(HttpServletRequest request) {
        String lang = request.getHeader(PATH_PARAMETER);
        Locale locale = request.getLocale();
        if (!StringUtils.isEmpty(lang)) {
            String[] split = lang.split(PATH_PARAMETER_SPLIT);
            locale = new Locale(split[0], split[1]);
        }
        return locale;
    }

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

    }
}

resolveLocale 方法作用就是我们的程序从哪获取指定的语言信息,我这里采用的是从header中获取指定语言,如果没有则采用浏览器 默认的。 还可以从 Session 或 Cookie 中获取。这里因为我们采取header中获取,所以前端发的请求中 Request Headers 中要有 key 为 lang,value 为 en_US 或 zh_CN 的header。

(2)将我们自定义的 MyLocaleResolverConfig 作为 Bean 注册进系统中:

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

(3)使用

@RequestMapping(value = "/test", method = RequestMethod.GET)
@ApiOperation(value = "test")
public ResponseData test(){
    String name = messageSource.getMessage("user.name", null, LocaleContextHolder.getLocale());
    return ResponseData.success("test success", name);
}

参考资料:

i18n-demo github.com/wang-tianqi…

SpringBoot 国际化的两种方式 www.jianshu.com/p/bee4b682f…