我的机器上的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。
答案 0 :(得分:1)
来自ResourceBundle javadoc:
getBundle使用基本名称,指定的区域设置和默认值 locale(从Locale.getDefault获取)生成一个序列 候选包名称。如果指定的语言环境的语言,脚本, country和variant都是空字符串,那么基本名称就是 只有候选包名称。
换句话说,因为它无法找到MyResource_UK资源包,所以它在使用基本名称尝试之前使用系统默认值生成候选包名称(在您的情况下,成功找到德语束)。