ResourceBundle默认为英语

时间:2016-03-15 12:46:32

标签: java localization

设置

假设我有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);

问题:这只是一个黑客攻击,我相信有一种“预期”的方式来实现它。

问题

是否有一种简单的方法可以使Strings_enStrings_fr的父级?如果没有,例如将Strings_en加载到Strings是否合理,以便我可以将英语保留为显式本地化,同时保留默认本地化?

2 个答案:

答案 0 :(得分:5)

您可以将getDateRange重命名为Strings_en.properties(将英语设为默认本地化)并添加新的 Strings.properties

然后

Strings_en.properties

也会返回ResourceBundle.getBundle("path/to/Strings", Locale.ENGLISH).getLocale()

答案 1 :(得分:0)

旧线程,另一种解决方案: 您可以使用 ResourceBundle.ControlgetCandidateLocales 添加自定义候选语言(文件后缀)

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;
    }
  }