【问题标题】:Determining which Resource Bundle to use in Java 8确定在 Java 8 中使用哪个资源包
【发布时间】:2017-06-23 14:46:50
【问题描述】:

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

所以这里有一些演示代码:

RB.properties: 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 -> RBRB_en 甚至没有考虑到。所以这让我有点困惑,谁能解释一下哪个顺序是正确的?

【问题讨论】:

  • 你能告诉我们你的测试代码吗?顺序实际上应该如书中所述。您假设您的默认语言环境是en_US 还是您知道
  • 嗨,我将默认语言环境设置为“en_US”
  • 嗨@Marvin,我只是编辑帖子以使其更清晰

标签: java resourcebundle


【解决方案1】:

你必须区分丢失的bundles和丢失的keys

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

getBundle 使用基本名称、指定的语言环境和默认值 locale(从 Locale.getDefault 获得)生成一个序列 候选捆绑包名称。

...

getBundle 然后遍历候选包名称以找到它可以为其实例化实际资源包的第一个。

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

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

从此资源包或其父资源包中获取给定键的字符串。

法语包的父级是基本包(即RB.properties),这解释了为什么您看不到英文值(父链也在@987654329中进行了详细解释@'s javadoc 以上链接)。

如果你是,例如,你会观察到预期的行为。寻找德语资源包:

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

在这种情况下,getBundle 将找不到任何RB_de.properties 并回退到存在key1RB_en.properties 并将被返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 2020-03-02
    相关资源
    最近更新 更多