确定在Java8中使用哪个资源包
我有3个资源包(RB)属性文件:确定在Java8中使用哪个资源包,java,resourcebundle,Java,Resourcebundle,我有3个资源包(RB)属性文件:RB\u en、RB\u fr和RB。我将默认区域设置为“en_US”,现在我使用getBundle(“RB”,new Locale(“fr”)获取键“key1”的值。我知道Java将首先查找属性文件RB_fr,但是如果在RB_fr中找不到键“key1,那么它将继续查找哪个顺序?RB\u en文件或RB文件 下面是一些演示代码: RB.properties: 键1=值b RB_en.属性: 键1=值b_en RB_fr.properties:key2=值RB_fr
RB\u en、RB\u fr和RB
。我将默认区域设置为“en_US
”,现在我使用getBundle(“RB”,new Locale(“fr”)
获取键“key1”的值。我知道Java将首先查找属性文件RB_fr,但是如果在RB_fr
中找不到键“key1,那么它将继续查找哪个顺序?RB\u en
文件或RB
文件
下面是一些演示代码:
RB.properties:
键1=值b
RB_en.属性:
键1=值b_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程序员II,它说顺序是
RB\u fr->RB\u en->RB
。但是当我运行一个测试时,它显示的顺序是RB\u fr->RB
,而RB\u en
甚至没有考虑。所以这让我有点困惑,谁能解释一下哪个顺序是正确的吗?您必须区分丢失的捆绑包和丢失的密钥
您首先使用请求法语资源包。此查找确实如本书和相应的javadoc中所述:
getBundle使用基本名称、指定的区域设置和默认值
locale(从locale.getDefault获得)生成
候选包名称
然后,getBundle迭代候选bundle名称,以找到它可以实例化实际资源bundle的第一个名称
由于存在RB_fr.properties
,它将查找并实例化该属性
然后使用请求键key1
的值。但是除了getBundle
之外,它没有默认语言环境的回退。它只在当前包和任何父包中查找:
从该资源束或其父级之一获取给定密钥的字符串
法语包的父包是基本包(即,RB.properties
),这解释了为什么您看不到英语值(父链在上面链接的getBundle
的javadoc中也有详细解释)
如果您正在寻找德国资源包,您将观察到预期的行为:
ResourceBundle b = ResourceBundle.getBundle("RB", new Locale("de"));
b.getString("key1"); // valueRB_en
在这种情况下,
getBundle
将找不到任何RB\u de.properties
并返回到RB\u en.properties
,其中存在并将返回key1
。您可以向我们展示您的测试代码吗?顺序实际上应该和书中描述的一样。你认为你的默认区域设置是en_US
还是你知道?嗨,我把我的默认区域设置为'en_US'Hi@Marvin,我只是编辑了这篇文章让它更清晰