ResourceBundle是java开发中非常实用的一个类,主要用来处理应用程序多语言这样的国际化问题。
如果你的应用程序如果有国际化的需求,可以考虑使用ResourceBundle, 你要做的就是给出满足特定格式的Properties 文件,例如
resource.propreties
resource_zh_CN.properties
resource_ja_JP.properties.
然后应用程序使用ResourceBundle.getBundle(“resource”, locale) 就可以自动的搜索的相应Locale的Properties 文件。
虽然看起来很方便,但使用起来需要注意两个问题: 1 Properties 文件的搜索次序, 2. 决定是否能找到Properties 文件的ClassLoader , 这也是很多初学者遇到的问题
1. 搜索次序。
先来看个例子,假设你的系统只有两个Properties
(1) resource.zh_CN.properties : 中文的Properties
(2) resource.properties : 英文的Properties
假设你Java 的default locale是zh_CN, 如果你调用 ResourceBundle.getBundle(“resource”, Locale.US) , 你觉得系统会使用哪一个文件中的内容?
很多人会觉得会使用resource.properties 中的内容, 但实际上不是这样的,当你传入一个Locale.US 给ResourceBundle的时候 , ResourceBundle的搜索次序是这样:
(1) resource_en_US.properties --- 没找到
(2) resource_en.properties --- 还是没找到
(3) resource_zh_CN.properties ---- default locale, 找到了
(4) resource_zh_properties
(5) resource.properties
注意,ResourceBundle会自动的加上一个default locale 即 zh_CN 来搜索
系统没有找到xxxx__en_US.properties, 也没有找到xxx_en.properties, 而是找到了xxx_zh_CN.properties, 就会使用其中的内容, 所以你看的的是中文的结果。
实际上ResourceBundle 搜索结束以后,会建立一个ResourceBundle 对象的Chain, 对于上面的例子会是这样:
ResourceBundle_2 [locale=zh_CN , parent = ResourceBundle_1]
ResourceBundle_1 [locale = empty parent = null]
你可能要问,这个链表中问什么没有en_US,en 和zh相关的信息? 这是因为他们相关的Properties 不存在, 没有必要加入这个链表中。
如果你的应用程序访问resource文件的一个值得时候, 系统会先在ResourceBundle_2[Locale=zh_CN] 这个对象中找, 如果找到,直接返回相应的值
如果没有找到,顺着parent 即ResourceBundle_1继续寻找, 如果还没有找到,只好返回null 了, 因为没有parent 了
2. ClassLoader
这个也是经常出问题的地方, 很多时候当你准备好各种Locale 的Properties 文件, 调用ResourceBundle.getBundle(“resource”, Locale.US) 时,系统总是告诉你, 找不到resource_en_US的文件, 很是令人抓狂。
主要的原因就是ClassLoader 不对 ,有空接着写 :-)
相关推荐
NULL 博文链接:https://singleant.iteye.com/blog/1485781
国际化插件-ResourceBundle Editor
ResourceBundle Editor (eclipse-rbe)是一个用于编辑本地化的属性文件(localized properties files)。它让你通一个屏幕就能够同时管理所有相关联属性文件中的key/value信息。它所具有的功能包括:自动为Keys分类,...
这里面有详细的处理maven项目中resources目录下的资源文件,方便快捷的得到或设置资源文件中的内容,本人亲测,里面还有示例
java.util.ResourceBundle使用详解
ResourceBundle:资源包,包括图片源代码
ResourceBundle rb = ResourceBundle.getBundle(name, Locale.getDefault()); 3。使用java.util.PropertyResourceBundle类的构造函数 示例: InputStream in = new BufferedInputStream(new FileInputStream...
j18n替代了java.util.ResourceBundle以支持Unicode属性文件。 您可以将UTF8字符放入* .properties中,唯一的代码更改是将“ ResourceBundle.getBundle(..)”替换为“ J18n.getBundle(..)”。
下面小编就为大家带来一篇ResourceBundle类在jsp中的国际化实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
ResourceBundle 是一个固执的 Symfony 包,用于帮助开发 REST API。 它为您做出一些架构决策,使您能够更多地关注应用程序的领域。 它使用尽可能少的魔法,使其更易于理解、调试和扩展。 ##Prerequisites ...
开发它是为了简化创建 ResourceBundle 源的过程,而不必每次使用 genrb 重新编译源文件。 这个项目既不是真正的一部分,也不是。 用法 : 测试文件 <?php use Adoy \ ICU \ ResourceBundle \ ResourceBundle ;...
NULL 博文链接:https://leiwuluan.iteye.com/blog/369909
可视化的插件编写,也可以转化国际化语言,挺不错的小工具
private ResourceBundle resourceBundle; public CommonParam() { propertyFileName = "com/test/dao/SysConfig"; resourceBundle = ResourceBundle.getBundle(propertyFileName); } public String ...
ResourceBundleEditor 资源文件编辑器 eclipse的资源文件编辑插件 经常在做国际化的时候编辑properties文件。转换文件字符总是让人比较繁琐。有了这个插件所见即所得。我们输入中文的时候自动就转换完毕了。...
resourcebundleeditor在eclipse里面的设置和使用
ResourceBundle Editor 是一个用于编辑本地化的属性文件(localized properties files)的 Eclipse 插件。它让你通一个屏幕就能够同时管理所有相关联属性文件中的 key/value 信息。它所具有的功能包括:自动为Keys分类...
Eclipse中配置junit、用法、检查表