使用 类 而不是属性文件或 ListResourceBundles 时 ResourceBundle.getBundle() 的强制语言
Mandatory language for ResourceBundle.getBundle() when using classes instead of properties files or ListResourceBundles
如果我有这样的属性:
- I18N.properties
- I18N_en.properties
- I18N_en_US.properties
我可以使用 ResourceBundle.getBundle(Locale.FRANCE)
,它将加载默认属性 (I18N.properties)。如果我使用 ListResourceBundle 类 而不是属性,这也有效。
但是如果我尝试使用 ResourceBundle 类,规则似乎不同,我需要至少有一个 I18N_xx.class
,它不会使用默认的 I18N.class
:例如语言环境 en_CA
将加载 I18N_en.class
但语言环境 fr_FR
(或 Locale.FRANCE
)不会加载 I18N.class
,相反我得到:
Can't find bundle for base name I18N, locale fr_FR
此外,如果我添加一个 I18N.properties 文件,那么 getBundle() 会找到它...
这是正常行为吗?我错过了什么吗? The doc 似乎暗示这是正常的(请注意,示例中的候选人列表以 {base name}_{lang}
结尾),但如果是这样,我不明白其中的道理吗?为什么基本默认值应该是属性文件?
好的,所以真正的答案是,我的基础 ResourceBundle
class 的构造函数不是 public...
然而,在对此进行调查时,我发现了另一个奇怪的地方:
似乎如果它找不到该语言的资源,它会尝试使用默认语言环境而不是转到基本文件:如果我的默认语言环境是基于英语的语言环境,比如说,en_IE
然后请求 fr_FR
资源会产生 en
资源,如果默认为 en_US
,fr_FR
资源来自 en_US
包。
在服务器中,这会很痛苦,因为服务器范围的默认语言不会为所有用户产生足够的行为,但似乎 Java 定义了 language/country 中立的 Locale.ROOT
用于此目的的静态。
如果我有这样的属性:
- I18N.properties
- I18N_en.properties
- I18N_en_US.properties
我可以使用 ResourceBundle.getBundle(Locale.FRANCE)
,它将加载默认属性 (I18N.properties)。如果我使用 ListResourceBundle 类 而不是属性,这也有效。
但是如果我尝试使用 ResourceBundle 类,规则似乎不同,我需要至少有一个 I18N_xx.class
,它不会使用默认的 I18N.class
:例如语言环境 en_CA
将加载 I18N_en.class
但语言环境 fr_FR
(或 Locale.FRANCE
)不会加载 I18N.class
,相反我得到:
Can't find bundle for base name I18N, locale fr_FR
此外,如果我添加一个 I18N.properties 文件,那么 getBundle() 会找到它...
这是正常行为吗?我错过了什么吗? The doc 似乎暗示这是正常的(请注意,示例中的候选人列表以 {base name}_{lang}
结尾),但如果是这样,我不明白其中的道理吗?为什么基本默认值应该是属性文件?
好的,所以真正的答案是,我的基础 ResourceBundle
class 的构造函数不是 public...
然而,在对此进行调查时,我发现了另一个奇怪的地方:
似乎如果它找不到该语言的资源,它会尝试使用默认语言环境而不是转到基本文件:如果我的默认语言环境是基于英语的语言环境,比如说,en_IE
然后请求 fr_FR
资源会产生 en
资源,如果默认为 en_US
,fr_FR
资源来自 en_US
包。
在服务器中,这会很痛苦,因为服务器范围的默认语言不会为所有用户产生足够的行为,但似乎 Java 定义了 language/country 中立的 Locale.ROOT
用于此目的的静态。