假设我有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_
的父包),查找缺少的字符串将返回默认的英文版本。
问题:系统现在具有默认本地化,但它不再理解存在英语本地化。
获取字符串时,检查它是否存在于包中 - 如果不存在,则从英文字母中取出。
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);
问题:这只是一个黑客攻击,我相信有一种“预期”的方式来实现它。
是否有一种简单的方法可以使Strings_en
为Strings_fr
的父级?如果没有,例如将Strings_en
加载到Strings
是否合理,以便我可以将英语保留为显式本地化,同时保留默认本地化?
答案 0 :(得分:5)
您可以将getDateRange
重命名为Strings_en.properties
(将英语设为默认本地化)并添加新的空 Strings.properties
。
然后
Strings_en.properties
也会返回ResourceBundle.getBundle("path/to/Strings", Locale.ENGLISH).getLocale()
。
答案 1 :(得分:0)
旧线程,另一种解决方案:
您可以使用 ResourceBundle.Control
和 getCandidateLocales
添加自定义候选语言(文件后缀)
ResourceBundle.getBundle(baseName, locale, new ResourceBundle.Control() {
@Override
public List<Locale> getCandidateLocales(String baseName, Locale locale) {
List<Locale> list = super.getCandidateLocales(baseName, locale);
list.add(new Locale("en"));
return list;
}
}