我有一个用例,我必须使用资源包在UI上显示各种文本.其中一些资源包条目采用参数(例如{0}),因为我使用h:outputFormat,但有时这还不够.
例如
someMessage=Display this message with param {0}
Run Code Online (Sandbox Code Playgroud)
在资源包中.
要在xhtml上显示我通常会这样做:
<h:outputFormat value="#{msg['someMessage']}"><f:param value="#{someBean.value}"/></h:outputFormat>
Run Code Online (Sandbox Code Playgroud)
当这是一个简单的案例时,这很有效,但对于更复杂的用例,这还不够.例如,如果我希望commandLink的'title'属性使用上面的资源包条目:
<h:commandLink action="logout" title="#{msg['someMessage']}">
<f:param value="#{someBean.value}" />
<h:graphicImage library="images" name="image.png" />
</h:commandLink>
Run Code Online (Sandbox Code Playgroud)
这不起作用.我也尝试过:
<h:commandLink action="logout">
<f:attribute name="title">
<h:outputFormat value="#{msg['someMessage']}"><f:param value="#{someBean.value}"/></h:outputFormat>
</f:attribute>
<h:graphicImage library="images" name="image.png" />
</h:commandLink>
Run Code Online (Sandbox Code Playgroud)
这也不起作用,因为f:attibute不允许孩子.
即使有一个黑客绕过这个(例如使用来自primefaces的悬停组件),还有其他字段可能需要参数化消息.
有没有人知道使用MessageFormat的方法,该方法在JSF组件的非值字段中获取参数?
您可以为此创建一个自定义EL函数,最终可以像这样:
<h:commandLink ... title="#{my:format(msg['someMessage'], someBean.value)}" />
Run Code Online (Sandbox Code Playgroud)
您可以使用MessageFormat
API来执行作业,就像<h:outputFormat>
在封面下一样.
另一种方法是创建一个自定义组件,它与JSTL的良好"ol"相同,<fmt:message>
它支持var
将格式化消息导出到EL范围的属性.
<my:outputFormat ... var="linkTitle">
...
</my:outputFormat>
<h:commandLink ... title="#{linkTitle}" />
Run Code Online (Sandbox Code Playgroud)
更新:JSF实用程序库OmniFaces具有用于此目的的#{of:formatX()}
功能和<o:outputFormat>
组件.
归档时间: |
|
查看次数: |
3732 次 |
最近记录: |