我的机器(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资源捆绑包,因此在尝试仅使用基本名称(在您的情况下,成功找到德语捆绑包)之前,它会使用系统默认值生成候选捆绑包名称。