是否有方便的方法将参数传递给从资源包到 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。
答案 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提供对此类服务类的单一访问。
这需要做一些额外的工作,但是解决了这个问题并且值得花时间。