我有 3 个资源包 (RB) 属性文件:RB_en、RB_fr 和 RB
。我设置了默认区域设置“en_US
”,现在我使用 getBundle("RB", new Locale("fr"))
来获取键“键1”。我知道Java会首先查找属性文件RB_fr,但是如果在RB_fr
中找不到键“key1”,那么它会以什么顺序继续查找? RB_en
文件还是 RB
文件?
这里有一些演示代码:
RB.属性: key1 = valueRB
RB_en.properties: key1 = valueRB_en
RB_fr.properties:key2 = valueRB_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 。所以这让我有点困惑,谁能解释一下哪个顺序是正确的?
最佳答案
您必须区分丢失的 bundle 和丢失的 key 。
您首先使用 getBundle
请求法语资源包。这个查找确实如书中和相应的 javadoc 中所述:
getBundle uses the base name, the specified locale, and the default locale (obtained from Locale.getDefault) to generate a sequence of candidate bundle names.
...
getBundle then iterates over the candidate bundle names to find the first one for which it can instantiate an actual resource bundle.
由于 RB_fr.properties
存在,它将找到并实例化它。
然后,您将使用 getString
请求键 key1
的值。但除了 getBundle 之外,它没有返回到默认语言环境的功能。它仅在当前包和任何父包中查找:
Gets a string for the given key from this resource bundle or one of its parents.
法语包的父级是基础包(即 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
> 存在并将被返回。
关于java - 确定在 Java 8 中使用哪个资源包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44724269/