如何在ResourceBundle中设置非翻译字符串的默认值?

时间:2016-12-13 12:54:53

标签: java resources

我需要更改java资源包的默认行为。 默认行为是使用默认语言文件,如果当前语言中没有键。

我的所有ressourceBundle都是通过ResourceBundle.getBundle(...)加载的,我无法更改此内容。

我需要更改默认值以使用密钥而不是默认语言值。 示例:mb.properties包含hello.string = hello world,当前区域设置使用不包含密钥mb_de.properties的文件hello.string。调用getString("hello.string")应该返回“hello.string”而不是“hello world”。

那么如何编写自定义资源包包装器来实现这个功能呢?

1 个答案:

答案 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