ResourceBundle.getBundle(class,locale) 不要获取默认 Bundle



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

我尝试为所选的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"));

输出为:

捆绑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()清除缓存,但没有成功。

当我实现另一个语言捆绑包并要求它时,我得到了它,但我没有得到默认捆绑包类。

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

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

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

来自ResourceBundle javadoc:

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

换言之,由于找不到MyResource_UK资源捆绑包,因此在尝试仅使用基本名称(在您的情况下,成功找到德语捆绑包)之前,它会使用系统默认值生成候选捆绑包名称。

最新更新