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

klo*_*onq 1 jsf internationalization

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

示例1:所需的HTML输出

<p>Simply <a href="contact.xhtml">contact us</a> to find out more.</p>
Run Code Online (Sandbox Code Playgroud)

例2:简单的facelt实现上述

<p>Simply <h:link outcome="contact" value="contact us"/> to find out more.</p>
Run Code Online (Sandbox Code Playgroud)

期望的结果:与ResourceBundle相同但是相同

的facelet

<p>
    <h:outputText value="${template['paragraph']}">
        <f:param>
            <h:link outcome="contact" value="${template['contactUs']}"/>
        </f:param>
    </h:outputText>
</p>
Run Code Online (Sandbox Code Playgroud)

资源包

paragraph=Simply {0} to find out more.
contactUs=contact us
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 6

问题不完全是JSF导航规则,但您不能用于<f:param>将JSF组件指定为bundle参数,更不用说普通的vanilla HTML子代.另外,请注意,您不能使用<f:param><h:outputText>,但只有在<h:outputFormat>.

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

<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>
Run Code Online (Sandbox Code Playgroud)

或者,如果你想利用JSF ViewHandler#getBookmarkableURL()等作为<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>
Run Code Online (Sandbox Code Playgroud)

由于您不是第一个偶然发现这一点并且变通方法很难处理的人,因此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>
Run Code Online (Sandbox Code Playgroud)