java - 确定在 Java 8 中使用哪个资源包

标签 java resourcebundle

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

相关文章:

java - 玩家似乎正在与空气碰撞?

java - PropertiesConfiguration 和 PropertyResourceBundle 在 Windows 和 Linux 上的行为不同

java - 我可以扩展 Java 包查找以返回解压缩的属性文件吗?

java - 处理@RequestBody

java - 根据数字将数组排序为 3 个桶

java - 如何在一种方法和另一种方法中使用声明的变量。

java - 为什么在我的 do while 循环中没有到达这一行?

ios - 将数据从 bundle 移动到用户文档文件夹无法准确响应

java - 使用 ResourceBundle 更改应用程序的语言

Java:如何在属性文件中写入 "Arabic"?