我有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
。