最近做个项目,需要用到i18n,所以复习和总结一下,主要是关于资源文件命名(propertites)和搜索这方面。
命名很简单,基名_语言码_地区码_操作系统码.propertites ,网上关于这个的介绍和讲解很多,我就不再说一遍了。
关于搜索规则,发现点以前没用注意到的:
1. 现在Locale对象的构造方法,有3个 :
Locale(String language)
Locale(String language, String country)
Locale(String language, String country, String variant)
可以知道 language 参数是必须给的,其他两个可选,但是必须按顺序设置,不可以随意设置,对象中也没有提供相应的set方法。
所以在搜索顺序就是依次递减的,按照设置的参数个数,依次减少来匹配文件名,
如 new Locale("zh" , "cn")
则会先找 基名_zh_ch 文件名的,再找 基名_zh 文件名的 ,最后在找 基名 文件名的,
但是如有一个文件 基名_zh_ch_window 名字的就不会被搜索,要注意这一点。
同理 new Locale("zh" ) 也不会搜索 基名_zh_ch 名字的文件
2. 如果1步没有匹配到文件,就会按系统默认的Locale环境来搜索,比如我的操作系统就是 zh_ch,步骤同1步。
3. 如果2步没有匹配到文件,就会加载 Locale.ENGLISH 的对象,就是 en-us ,步骤同1步 。
4. 如果3步没有匹配到文件,就会有如下异常抛出 :
java.util.MissingResourceException: Can't find bundle for base name i18n.res, locale en_US
以上结论经由测试和部分源码总结而来,并不全面,欢迎大家补充!