设置
假设我有2个字符串文件:
Strings_en.properties
Strings_fr.properties
假设英语是默认语言,并且所有字符串都存在,而法语滞后并且缺少一些字符串。
期望的行为
在这两种情况下,我都希望重新使用英语:
ResourceBundle.getBundle("path/to/Strings", Locale.GERMAN);
ResourceBundle.getBundle("path/to/Strings", Locale.FRENCH).getString("only.in.english");
第一次回退很简单:按照documentation的要求,将英语作为默认语言环境就足够了,例如通过设置
Locale.setDefault(Locale.ENGLISH);
即可。问题
我的问题是第二次后备。如果在
Strings_fr
中找不到该字符串,则查找继续到“父捆绑”:getObject() documentation。但是,Strings_en
不是Strings_fr
的父级,并且会抛出MissingResourceException
。解决方法
一个简单的解决方法是将
Strings_en.properties
重命名为Strings.properties
。这使它成为Strings_fr
(以及任何其他Strings_
)的父包,并查找丢失的字符串将返回默认的英语版本。问题:系统现在具有默认的本地化,但是它不再理解存在英语本地化。
解决方法2
提取字符串时,请检查捆绑包中是否包含该字符串-如果不存在,请改用英文字符串。
ResourceBundle bundle = ResourceBundle.getBundle("path/to/Strings", Locale.FRENCH);
if (bundle.containsKey(key)) { return bundle.getString(key); }
return ResourceBundle.getBundle("path/to/Strings", DEFAULT_WHICH_IS_ENGLISH).getString(key);
问题:这只是一个hack,我相信有一种“预期的”方式可以做到这一点。
问题
有没有一种简单的方法可以使
Strings_en
成为Strings_fr
的父级?如果不是,例如将Strings_en
硬链接(hard link)到Strings
是否合理,这样我就可以将英语保留为显式本地化,同时保留为默认本地化? 最佳答案
您可以将Strings_en.properties
重命名为Strings.properties
(使英语成为默认本地化语言),然后添加一个新的空 Strings_en.properties
。
然后
ResourceBundle.getBundle("path/to/Strings", Locale.ENGLISH).getLocale()
还返回
Locale.ENGLISH
。关于java - 默认为英语的ResourceBundle,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36011759/