ResourceBundle.getBundle(类,locale)没有获得默认的Bundle

时间:2014-10-28 12:22:18

标签: java

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

我尝试为选择的Locale获取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"));

输出是:

  

Bundle com.example.MyRessource_de@6cf82c7d

     

absenden

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

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

但输出是:

  

Bundle com.example.MyRessource_de@6cf82c7d

     

absenden

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

当我实现另一个语言包并且要求它我得到它,但我没有得到Default-Bundle类。

我不知道为什么Java会以这种方式表现,并且会对任何答案感到高兴。

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

BTW:我的Windows系统语言是de。

1 个答案:

答案 0 :(得分:1)

来自ResourceBundle javadoc:

  

getBundle使用基本名称,指定的区域设置和默认值   locale(从Locale.getDefault获取)生成一个序列   候选包名称。如果指定的语言环境的语言,脚本,   country和variant都是空字符串,那么基本名称就是   只有候选包名称。

换句话说,因为它无法找到MyResource_UK资源包,所以它在使用基本名称尝试之前使用系统默认值生成候选包名称(在您的情况下,成功找到德语束)。