我有3个资源束(RB)属性文件:RB_en, RB_fr and RB。我将默认语言环境设置为“ en_US”,现在使用getBundle("RB", new Locale("fr"))来获取键“ key1”的值。我知道Java将首先查找属性文件RB_fr,但是如果在RB_fr中找不到键“ key1”,那么它将继续在哪个目录中查找? RB_en文件还是RB文件?

因此,这里有一些演示代码:

RB.properties:
key1 = valueRB

RB_en.properties:
key1 = valueRB_en

RB_fr.properties:key2 =值RB_fr

 Locale fr = new Locale("fr");
 Locale.setDefault(new Locale("en", "US"));
 ResourceBundle b = ResourceBundle.getBundle("RB", fr);
 b.getString("key1");


我读了一本书,OCP Java SE 8 Programmer II,它说命令将是RB_fr -> RB_en -> RB。但是,当我运行测试时,显示的顺序为RB_fr -> RB,甚至没有考虑RB_en。所以这让我有些困惑,谁能解释给我哪个顺序是正确的?

最佳答案

您必须区分丢失的包和丢失的密钥。

您首先使用getBundle请求法语资源包。此查找确实如本书和相应的javadoc中所述:


  getBundle使用基本名称,指定的语言环境和默认名称
  语言环境(从Locale.getDefault获取)以生成序列
  候选包名称。
  
  ...
  
  然后,getBundle遍历候选包名称,以找到第一个可以实例化实际资源包的名称。


由于RB_fr.properties存在,它将找到并实例化它。

然后,您使用key1请求键getString的值。但是,除了getBundle之外,它没有回退到默认语言环境的功能。它仅在当前捆绑包中,并且仅在任何父级中出现:


  从此资源束或其父级中获取给定密钥的字符串。


法语捆绑包的父级是基本捆绑包(即RB.properties),它说明了为什么看不到英语值(在上面getBundle的javadoc链接中也详细解释了父级链)。

如果您是例如,您将观察到预期的行为。寻找德国资源包:

ResourceBundle b = ResourceBundle.getBundle("RB", new Locale("de"));
b.getString("key1"); // valueRB_en


在这种情况下,getBundle将找不到任何RB_de.properties并退回到存在RB_en.properties并返回的key1

07-24 19:21