如何删除周围???在捆绑中找不到邮件时

时间:2011-06-23 08:23:21

标签: jsf resourcebundle

在JSF 2.0中,如果在消息包中找不到消息,则默认情况下,该键被???包围。这是开发过程中非常有用的提示。但是,在我的特定情况下,我真的希望那些???不存在。我更喜欢只渲染密钥。

E.g。当我做的时候

#{msg.hello}

并且密钥'hello'不存在,然后页面显示

  

??? ???你好

但我想展示裸键

  

您好

消息包在JSF页面中加载如下:

<f:loadBundle basename="resources.text" var="msg" />

<f:loadBundle>标记似乎没有一个属性来操纵从该包中检索值的方式。我应该覆盖某个类或如何拦截从包中检索消息的方式吗?

我发现了一篇非常有趣的文章:Context Sensitive Resource Bundle entries in JavaServer Faces applications – going beyond plain language, region & variant locales。但是,就我而言,我只想省略???。我认为这个解决方案相当复杂。我怎么能实现呢?

2 个答案:

答案 0 :(得分:7)

basename可以指向一个值得信赖的ResourceBundle课程。 E.g。

<f:loadBundle basename="resources.Text" var="msg" />

package resources;

public class Text extends ResourceBundle {

    public Text() {
        setParent(getBundle("resources.text", FacesContext.getCurrentInstance().getViewRoot().getLocale()));
    }

    @Override
    public Enumeration<String> getKeys() {
        return parent.getKeys();
    }

    @Override
    protected Object handleGetObject(String key) {
        return parent.getObject(key);
    }

}

您可以覆盖handleGetObject中的捆绑邮件处理。 JSF默认情况下(按规范)调用getObject(),捕获MissingResourceException并在捕获时返回"???" + key + "???"。你可以采用不同的方式。

@Override
protected Object handleGetObject(String key) {
    try {
        return parent.getObject(key);
    } catch (MissingResourceException e) {
        return key;
    }
}

答案 1 :(得分:-1)

您还可以创建一个简单的bean来处理字符串操作。如果您不需要在所有地方都删除默认环境,而仅在特定位置上,则此方法会更好。第二个函数使用起来更安全,因为它还处理了以???开始和结束翻译的情况。

@ApplicationScoped
@Named
public class LocaleUtils {

    public String getMessage(String s) {
        return clearMessage(s);
    }

    public Object getMessage(ResourceBundle propertyResourceBundle, String key) {
        try {
            return propertyResourceBundle.getObject(key);
        }
        catch (MissingResourceException e) {
            return clearMessage(key);
        }
    }

    private static String clearMessage(String s) {
        String clearMessage = s;
        String prefix = "???", suffix = "???";

        if (s != null && s.startsWith(prefix) && s.endsWith(suffix)) {
            s = s.substring(prefix.length());
            clearMessage = s.substring(0, s.length() - suffix.length());
        }
        return clearMessage;
    }
}

用法:

<h:outputText value="#{localeUtils.getMessage(msg['hello'])}"/>
<h:outputText value="#{localeUtils.getMessage(msg, 'hello')}"/>