设置

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

    10-13 02:26