将参数传递给从资源包到**以外的组件的消息:outputFormat **

时间:2011-04-17 23:29:27

标签: jsf jsf-2 richfaces facelets resourcebundle

是否有方便的方法将参数传递给从资源包到 h:outputFormat 以外的组件的消息?

例如,这是合法的:

<h:outputFormat value="#{myBundle['parametricMessage']}">
    <f:param value="#{myBundle['someParameterValue']}"/>
</h:outputFormat>

但我需要一个按钮,就像这样(不起作用):

<h:commandButton value="#{myBundle['parametricMessage']}">
    <f:param value="#{myBundle['someParameterValue']}"/>
</h:commandButton>

当然,我可以使用链接而不是按钮,我可以通过托管bean中的属性来实现,但在这个问题中,我正在寻找一种方便方式使用按钮......

我正在使用RichFaces 3.3.3,JSF2,facelets。

3 个答案:

答案 0 :(得分:13)

这种做法怎么样?

EL expression allow you to define a function。首先定义一个EL表达式的函数,它接受一个资源包,它的消息键和占位符的参数,并输出已解析的消息。

public static String geti18nMsg(ResourceBundle bundle ,String msgKey, String paramValue ) {
    String  msgValue = bundle.getString(msgKey);
    MessageFormat   messageFormat = new MessageFormat(msgValue);
    Object[] args = {paramValue};
    return messageFormat.format(args);
}

然后调用此函数以在<h:commandButton>

中获取已解决的消息
<h:commandButton value="#{f:geti18nMsg(myBundle , parametricMessage, someParameterValue)}"/>

答案 1 :(得分:4)

试试这个:

<h:commandButton>
    <h:outputFormat value="#{myBundle['parametricMessage']}">
        <f:param value="#{myBundle['someParameterValue']}"/>
    </h:outputFormat>
</h:commandButton>

顺便说一下,这可以满足您的需求,也可以避免编写支持bean代码。

答案 2 :(得分:0)

嗯,我没有找到好的答案,所以这个问题将继续存在。 我发现的一个好习惯是,有一个特殊的类来表示每个资源包(具有参数化的东西),并传输所有的消息形成,并在那里使用上下文(比如,从FacesContext获取语言环境,得到一个ResourceBundle) ,应用参数等)。最后,从ManagedBean提供对此类服务类的单一访问。

这需要做一些额外的工作,但是解决了这个问题并且值得花时间。