我正在设置ResourceBundle,我得到了与Oracle文档相悖的奇怪结果。 https://docs.oracle.com/cd/E23095_01/Platform.93/ATGProgGuide/html/s1804resourcebundleinheritance01.html
我有 3 个文件:
Animals_fr.属性
name=animals_fr
Animals_en.普罗珀蒂斯
name=animals_en
age=5
动物属性
name=animals
age=0
然后我有代码:
Locale localeFr = new Locale("fr");
Locale.setDefault(new Locale("en","US"));
ResourceBundle b = ResourceBundle.getBundle("Animals", localeFr);
System.out.println(b.getString("name"));
System.out.println(b.getString("age"));
基于Oracle的文档继承应该是这样的:
Animals_fr - locale bundle
Animals_en - default locale bundle
Animals - default bundle
结果应该是:
animals_fr
5
但我得到的结果:
animals_fr
0
任何想法出了什么问题?
谢谢
您链接的文档描述了如何查找资源包,而不是如何解析单个资源键。
这与记录的默认行为相匹配,该行为说
如果指定区域设置的语言、脚本、国家/地区和变体都是空字符串,则基本名称是唯一的候选捆绑包名称。否则,将从指定区域设置(语言、脚本、国家/地区和变体)的属性值生成候选区域设置列表,并将其追加到基本名称中。
它描述了单个Locale
如何导致一系列候选名称。在您的情况下,这只是[ Animal_Fr ]
.然后,它说:
这将持续到实例化结果资源包或候选包名称列表用尽为止。如果未找到匹配的资源包,则调用默认控件的
getFallbackLocale
方法,该方法返回当前默认区域设置。使用此区域设置生成新的候选区域设置名称序列,并再次搜索,如上所述。
因此,如果Animal_Fr
不存在,它确实会回退到默认区域设置,尝试使用[ Animals_en_US, Animals_en ]
的候选序列。
但由于Animal_Fr
确实存在并且可以实例化,因此此查找将不会继续。相反,为了查找特定的资源键,链接变得相关,记录为:
找到结果资源包后,将实例化其父链。如果结果包已经有一个父包(可能是因为它是从缓存返回的),则链是完整的。
否则,
getBundle
将检查在生成结果资源包的传递过程中使用的候选区域设置列表的其余部分。[...]当涉及到候选列表的末尾时,它会尝试使用普通捆绑包名称。对于每个候选包名称,它都会尝试实例化资源包 [...]。只要成功,它就会使用新的资源包调用先前实例化的资源包的
setParent
方法。这一直持续到名称列表用尽或当前捆绑包已具有非空父级。
因此,链接的文档在getBundle
的整体行为方面是正确的,这是文档中描述的两步过程的结果。但是当涉及到与getString
行为相关的父链时,只会使用当前查找阶段的候选列表。
因此,根据实际存在的捆绑包,它最终可能会得到
Animals_fr ‣ Animals
或
Animals_en_US ‣ Animals_en ‣ Animals
在您的示例设置中。