我需要更改java资源包的默认行为。 默认行为是使用默认语言文件,如果当前语言中没有键。
我的所有ressourceBundle都是通过ResourceBundle.getBundle(...)
加载的,我无法更改此内容。
我需要更改默认值以使用密钥而不是默认语言值。
示例:mb.properties
包含hello.string = hello world
,当前区域设置使用不包含密钥mb_de.properties
的文件hello.string
。调用getString("hello.string")
应该返回“hello.string”而不是“hello world”。
那么如何编写自定义资源包包装器来实现这个功能呢?
答案 0 :(得分:0)
您可以通过这种方式扩展资源捆绑
public class CustomResourceBundle_en extends ResourceBundle {
public CustomResourceBundle_en() {
setParent(ResourceBundle.getBundle("messages_en"));
}
@Override
protected Object handleGetObject(String key) {
if (parent.keySet().contains(key)) {
return parent.getObject(key);
} else {
return key;
}
}
@Override
public Enumeration getKeys() {
return parent.getKeys();
}
}
然后另一个用于en locale例如
public class CustomResourceBundle_it extends CustomResourceBundle_en {
public CustomResourceBundle_it() {
setParent(ResourceBundle.getBundle("messages_it"));
}
}
创建两个属性文件 的 message_en.properties 强>
hello.world=Hello World
message_it.properties 留空
然后以这种方式使用
ResourceBundle messages = ResourceBundle.getBundle("CustomResourceBundle", Locale.ENGLISH);
System.out.println(messages.getString("hello.world"));
它将打印 Hello world ,否则使用locale
ResourceBundle messages = ResourceBundle.getBundle("CustomResourceBundle", Locale.ITALIAN);
System.out.println(messages.getString("hello.world"));
它将打印键 hello.world