是 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…