1.由于在yml中配置的国际化路径会被其他jar包中的yml所覆盖,因此自定义一个MessageSource进行国际化转义
-
自定义messageSource
-
生成工具类,通过调用工具类的getMessage方法进行国际化
2.在线上部署时出现问题,国际化不生效,但本地国际化文件生效
-
初步定位问题:本地的LocaleContextHolder.getLocale()得到的Locale类型为zh_CN
而线上部署时候该方法得到的Locale类型为en_US
-
源码定位
localeContext为null的原因:由于是在程序启动时期调用该方法因此无法获取到LocaleContext,如果是通过request请求则会返回当前thread对应的上下文
// 该方法返回系统默认的Locale,由于线上环境Locale为en_US,
// 本地为zh_CN所以导致线上环境无法取到对应的国际化转义
return (defaultLocale != null ? defaultLocale : Locale.getDefault());
3.由于存在必须要在程序初始化时进行国际化转义的语句,因此希望通过在yml中配置一个属性language,可以灵活修改国际化转义类型。
为了测试该方法获取Locale是否生效,创建两个不同语言类型的bundle文件
在此基础上我认为,在程序初始化时调用getMessage方法进行转义时error文件中的语句应该转义失败,而message中的应该转义成功,但结果时两者都成功了
4.跟踪源码排查两者都成功的原因(以下均为源码)
5.结论
对于messageSource的getMessage方法
@Nullable
String getMessage(String code, @Nullable Object[] args, @Nullable String defaultMessage, Locale locale);
即使传入指定Locale,如果无法获取国际化文件对应该locale的转义文件,系统则会返回系统语言对应的转义文件