【问题标题】:ResourceBundle.getBundle(class,locale) don't get default BundleResourceBundle.getBundle(class,locale) 没有得到默认的 Bundle
【发布时间】:2014-10-28 12:22:17
【问题描述】:

我的机器(Windows 7 64 位)上的 Java7 和 Java8 上的 ResourceBundle.getBundle 有一个非常奇怪的行为,我很困惑。

我尝试为所选语言环境获取 MyRessource Bundle(扩展 RessourceBundle)。 这是简单的代码(缩短和简化):

默认 RessourceBundle 类:

public class MyRessource extends ResourceBundle {

    @Override
    protected Object handleGetObject(final String key) {
        if (key.equals("submit")) return "submit";
     return null;
    }
}

德语 RessourceBundle 类:

public class MyRessource_de extends MyRessource {

    @Override
    protected Object handleGetObject(final String key) {
        if (key.equals("submit")) return "absenden";
        return null;
    }
}

然后我想找回德语包:

    final ResourceBundle bundle_DE = 
          ResourceBundle.getBundle(MyRessource.class.getName(), Locale.GERMANY);
    LOG.debug("Bundle {}", bundle_DE);
    LOG.debug(bundle_DE.getString("submit"));

输出是:

捆绑 com.example.MyRessource_de@6cf82c7d

缺席

现在与另一种语言相同,这应该返回默认包:

    final ResourceBundle bundle_EN =
          ResourceBundle.getBundle(MyRessource.class.getName(), Locale.UK);
    LOG.debug("Bundle {}", bundle_EN);
    LOG.debug(bundle_EN.getString("submit"));

但是输出是:

捆绑 com.example.MyRessource_de@6cf82c7d

缺席

返回了相同的缓存包。 我尝试使用 ResourceBundle.clearCache() 清除缓存,但没有成功。

当我实现另一个 Language-Bundle 并要求它时,我得到了它,但我没有得到 Default-Bundle 类。

我不知道为什么 Java 会这样,并且很乐意得到任何答案。

在其他机器上,代码按预期工作。

顺便说一句:我的 Windows 系统语言是 de。

【问题讨论】:

标签: java


【解决方案1】:

来自 ResourceBundle javadoc:

getBundle 使用基本名称、指定的语言环境和默认值 locale(从 Locale.getDefault 获得)生成一个序列 候选捆绑包名称。如果指定语言环境的语言、脚本、 country 和 variant 都是空字符串,则基本名称是 唯一的候选包名称。

换句话说,由于它找不到 MyResource_UK 资源包,它使用系统默认值生成候选包名称,然后再尝试仅使用基本名称(在您的情况下,成功找到德语包) .

【讨论】:

  • 非常感谢,设置 Locale.setDefault(Locale.UK) 就可以了。我会投票赞成这个答案,但我没有它的声誉。
猜你喜欢
  • 2016-06-29
  • 1970-01-01
  • 2020-03-14
  • 2023-01-21
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多