如果我有这样的财产:
i18n.特性
i18n\u en.属性
i18n\u en\u us.属性
我可以用 ResourceBundle.getBundle(Locale.FRANCE)
它将加载默认属性(i18n.properties)。如果我使用listresourcebundle类而不是属性,这也可以工作。
但是,如果我尝试使用resourcebundle类,规则似乎不同,我需要至少有一个 I18N_xx.class
,它将不使用默认值 I18N.class
:例如locale en_CA
将加载 I18N_en.class
但是区域设置 fr_FR
(或 Locale.FRANCE
)无法加载 I18N.class
相反,我得到:
找不到基名称i18n、locale fr\u fr的捆绑包
此外,如果我添加一个i18n.properties文件,那么getbundle()将找到它。。。
这是正常的行为吗?我错过什么了吗?文档似乎暗示这是正常的(注意,示例中的候选列表结束于 {base name}_{lang}
),但如果是这样的话,我就看不出理由了?为什么基本默认值应该是属性文件?
1条答案
按热度按时间csbfibhn1#
好的,所以真正的答案是,我的基的构造器
ResourceBundle
类不是公共的。。。然而,在调查这件事时,我发现了另一个奇怪之处:
如果它找不到该语言的资源,它会尝试使用默认语言环境,而不是转到基文件:如果我的默认语言环境是基于英语的语言环境,例如,
en_IE
然后要求fr_FR
资源产生en
一个,如果默认值是en_US
,fr_FR
资源来自en_US
捆绑。在服务器中,这将是一种痛苦,因为服务器范围内的默认语言不会为所有用户提供适当的行为,但是java似乎定义了一种语言/国家中立的语言
Locale.ROOT
这是静态的。