我正在设置ResourceBundle,但得到的结果却与Oracle文档相反。 https://docs.oracle.com/cd/E23095_01/Platform.93/ATGProgGuide/html/s1804resourcebundleinheritance01.html
我有3个文件:
Animals_fr.properties
name=animals_fr
Animals_zh.propertis
name=animals_en
age=5
Animals.properties
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
有什么想法吗?
谢谢
答案 0 :(得分:1)
您已链接的文档描述了如何查找资源束,而不是如何解析单个资源键。
这与documented default behavior匹配,即{p>
如果指定的语言环境的语言,脚本,国家/地区和变体都是空字符串,则基本名称是唯一的候选包名称。否则,将从指定语言环境的属性值(语言,脚本,国家/地区和变体)生成候选语言环境列表,并将其附加到基本名称之后。
描述单个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
在您的示例设置中。