使用 类 而不是属性文件或 ListResourceBundles 时 ResourceBundle.getBundle() 的强制语言

Mandatory language for ResourceBundle.getBundle() when using classes instead of properties files or ListResourceBundles

如果我有这样的属性:

我可以使用 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_USfr_FR 资源来自 en_US 包。

在服务器中,这会很痛苦,因为服务器范围的默认语言不会为所有用户产生足够的行为,但似乎 Java 定义了 language/country 中立的 Locale.ROOT 用于此目的的静态。