ResourceBundle-属性文件继承

时间:2019-04-26 17:35:54

标签: java java-8 sdk resourcebundle

我正在设置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

有什么想法吗?

谢谢

1 个答案:

答案 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

在您的示例设置中。