如何将JSF导航规则与ResourceBundle内容一起使用

时间:2013-03-23 17:05:27

标签: jsf internationalization

我有一个多语言网站,内容由ResourceBundles管理。如何使用JSF导航使用段落内容插入指向网站部分的链接。

示例1:所需的HTML输出

<p>Simply <a href="contact.xhtml">contact us</a> to find out more.</p>

示例2:简单的facelt实现上述

<p>Simply <h:link outcome="contact" value="contact us"/> to find out more.</p>

期望的结果:与ResourceBundle相同

的facelet

<p>
    <h:outputText value="${template['paragraph']}">
        <f:param>
            <h:link outcome="contact" value="${template['contactUs']}"/>
        </f:param>
    </h:outputText>
</p>

的ResourceBundle

paragraph=Simply {0} to find out more.
contactUs=contact us

1 个答案:

答案 0 :(得分:5)

问题不完全是JSF导航规则,但是你不能使用<f:param>将JSF组件指定为bundle参数,更不用说普通的vanilla HTML子节点了。另请注意,您不能在<f:param>中使用<h:outputText>,而只能在<h:outputFormat>中使用。{/ p>

无论如何,为了达到功能要求,你必须自己写下转义为<f:param value>的HTML。

<h:outputFormat value="#{template['paragraph']}" escape="false">
    <f:param value="&lt;a href='#{request.contextPath}/contact.xhtml'&gt;#{template['contactUs']}&lt;/a&gt;" />
</h:outputFormat>

或者,如果您想像ViewHandler#getBookmarkableURL()那样使用JSF <h:link>正在为其outcome属性执行,

<h:outputFormat value="#{template['paragraph']}" escape="false">
    <f:param value="&lt;a href='#{facesContext.application.viewHandler.getBookmarkableURL(facesContext, '/contact', null, false)}'&gt;#{template['contactUs']}&lt;/a&gt;" />
</h:outputFormat>

由于您不是第一个偶然发现这一点并且变通方法很尴尬的人,因此JSF实用程序库OmniFaces最近更新了其<o:param>组件,并支持将子代码编码为param值值已指定。从OmniFaces 1.5开始,您应该可以按如下方式使用它:

<h:outputFormat value="#{template['paragraph']}" escape="false">
    <o:param><h:link outcome="contact" value="#{template['contactUs']}" /></o:param>
</h:outputFormat>