ResourceBundle默认为英语

vek*_*tor 4 java localization

建立

假设我有2个字符串文件:

Strings_en.properties
Strings_fr.properties
Run Code Online (Sandbox Code Playgroud)

假设英语是默认语言,所有字符串都存在,而法语则落后,一些字符串丢失.

期望的行为

我希望在这两种情况下都回归英语:

  • 请求完全不同的语言环境时,例如德语.
    • ResourceBundle.getBundle("path/to/Strings", Locale.GERMAN);
  • 请求从法语中删除字符串时.
    • ResourceBundle.getBundle("path/to/Strings", Locale.FRENCH).getString("only.in.english");

第一个回退很简单:根据文档,将英语作为默认语言环境就足够了,例如通过设置Locale.setDefault(Locale.ENGLISH);.

问题

我的问题是第二次回退.如果找不到该字符串Strings_fr,则查找继续到"父包":getObject()文档.然而,Strings_en是不是家长Strings_frMissingResourceException抛出.

解决方法

一个简单的解决方法是重命名Strings_en.propertiesStrings.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);
Run Code Online (Sandbox Code Playgroud)

问题:这只是一个黑客,我相信有一种"有意"的方式来做到这一点.

是否有一个简单的方法来使Strings_en父母Strings_fr?如果没有,是不是合理的,例如硬连接Strings_enStrings,这样我可以保持英语作为一个明确的定位,并在同一时间作为默认的?

wer*_*ero 6

您可以重命名Strings_en.propertiesStrings.properties(使英语成为默认本地化)并添加新的空白 Strings_en.properties.

然后

ResourceBundle.getBundle("path/to/Strings", Locale.ENGLISH).getLocale()
Run Code Online (Sandbox Code Playgroud)

也回来了Locale.ENGLISH.