是否有一种方便的方法将参数传递到消息从资源包到组件,而不是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.
这个方法怎么样?
EL表达式允许您定义一个函数,您首先定义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)}"/>
试试这个:
<h:commandButton>
<h:outputFormat value="#{myBundle['parametricMessage']}">
<f:param value="#{myBundle['someParameterValue']}"/>
</h:outputFormat>
</h:commandButton>
顺便说一句,这是您想要的,也避免了必须编写后台bean代码。
我没有找到很好的答案,所以这个问题将继续开放。我发现的一个好做法是,使用一个特殊的类来表示每个资源包(有参数的东西),并传输所有的消息格式,并处理那里的上下文(比如,从FacesContext获取locale,获取ResourceBundle,应用参数等)。最后,从ManagedBean提供对此类服务类的单例的访问。
这需要做一些额外的工作,但解决了问题,值得花时间。