ResourceBundleMessageSource的底层实现
spring可以通过ResourceBundleMessageSource配置国际化支持,其内部实现是使用java的ResourceBundle作为资源本件绑定的实现
ResourceBundle文件的加载顺序
java里面有个官方的说明,简单翻译一下就是:
1代表指定国际化locale (language1, country1, and variant1)
2代表默认国际化locale (language2, country2, and variant2)
- baseName + “_”+ language1 + “_” + country1 + “_” + variant1
- baseName + “_” + language1 + “_” + country1
- baseName + “_” + language1
- baseName + “_” + language2 + “_” + country2 + “_” + variant2
- baseName + “_” + language2 + “_” + country2
- baseName + “_” + language2
- baseName
我们可以看出,加载顺序为:
优先加载指定国际化内容,之后加载默认国际化内容,最后加载顶级文件
这里一定要注意,加载过程含有系统默认国际化文件的加载,这可能和预期的加载顺序不一样,举个例子。
配置如下文件:
messages_en.properties
messages.properties 这里默认是中文
当运行在中文环境下,指定加载zh_CN,则加载的是messages.properties文件。
当运行在英文环境下,指定加载zh_CN,则加载的是messages_en.properties文件。
解决方法
可以通过配置 Locale.setDefault(Locale.CHINA); 方法来限制当前运行环境的本地化语言,既可避免意想不到的加载顺序。