在我的JSF2页面上,我正在使用国际化的错误消息。
在我的支持bean中,我将消息放入闪存范围:
flash.put("error", exception.getType());
在页面上,此字符串以这种方式翻译:
<h:outputText value="#{bundle[flash.error]}"/>
工作正常。
现在我想能够将(任意数量的)参数放入消息文本中,这些参数将被插入到message.properties中i18n属性的占位符中。因此,我将参数作为String数组放入Flash Scope中,如下所示:
//exception.getParameters returns String[]
flash.put("errorParams", exception.getParameters())
现在我还希望能够将此String数组用作outputFormat元素的参数,以将它们插入到Welcome, {0} {1}
之类的属性中。
所以我尝试使用 ui:repeat :
<h:outputFormat value="#{bundle[flash.error]}" rendered="#{! empty flash.error}" class="invalid">
<ui:repeat value="#{flash.errorParams}" var="_param">
<f:param value="#{bundle[_param]}"/>
<!-- also doesn't work: <f:param value="#{_param}"/>-->
</ui:repeat>
</h:outputFormat>
不幸的是,param值被忽略,i18n-property的占位符没有被替换,因此渲染的输出为Welcome, {0} {1}
。当使用“常规”转发器时,将数组元素显示为输出文本,它可以工作。所以outputFormat标签似乎不支持使用repeat作为子元素。
该死的,如此接近;)任何人都知道一个很好的方法来做我想要的,或者是否有任何组件库支持这样的东西?
答案 0 :(得分:8)
这里的问题是ui:repeat
是h:outputFormat
的渲染时子,它确实根本不支持。您希望在构建期间直接将多个f:param
元素作为h:outputFormat
的子元素。
c:forEach
适用于此任务。 JSTL核心标记(已经包含在Facelets中,因此您不需要安装任何额外的JAR)在构建视图树期间完成它们的工作,就在JSF转向进程之前/ render 视图树。
<html xmlns:c="http://java.sun.com/jsp/jstl/core">
...
<h:outputFormat value="#{bundle[flash.error]}" rendered="#{! empty flash.error}" class="invalid">
<c:forEach items="#{flash.errorParams}" var="_param">
<f:param value="#{bundle[_param]}"/>
</c:forEach>
</h:outputFormat>