有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在资源包中使用JSF标记/如何在资源包中重写URL?

环境: JSF2.1.7 SEAM 2.3.0 JBOSS 5.1.2

我的应用程序有一个字符串需要本地化

"I agree to WorldSite's Privacy Policy and Cookie Notice"

其中斜体的隐私政策Cookie通知是指向其他页面的超链接

最初我们的facelet是这样设置的:

<h:outputText value="#{messages['iAgreeTo']}" />
<h:outputLink target="_blank" value="#{bean.privacyPolicy}">#{messages['privacyPolicy']}</h:outputLink>
<h:outputText value="#{messages['and']}"/>
<h:outputLink target="_blank" value="/jsf/Notice.xhtml">
    <h:outputText value="#{messages['cookieNotice']}"/>
    <f:param name="content" value="Cookie-Notice"/>
    <f:param name="application" value="#{bean.application}"/>
</h:outputLink>

注意:我们有URL重写,需要/jsf/Notice。xhtml并重写为

rewrite pattern: /#{application}/Notice/#{content}
result:http://contextRoot/contextPath/myApp/Notice/Cookie-Notice

这允许对各个键进行零碎的翻译

iAgreeTo=I agree to WorldSite's&#160;
privacyPolicy=Privacy Policy
and=&#160;and&#160;
cookieNotice=Cookie Notice

但这需要一些语言的变通方法(在“iAgreeTo”和“and”键中)

iAgreeTo=J'accepte la&#160;
privacyPolicy=Politique de la vie privée
and=&#160;de WorldSite et les&#160;
cookieNotice=Note D'information sur les Cookies

理想情况下,我希望链接能够在密钥内移动。类似这样的内容:

iAgreePhrase=I agree to WorldSite's #{messages['privacyPolicyLink']} and the #{messages['cookieNoticeLink']}
privacyPolicy=Privacy Policy
cookieNotice=Cookie Notice

//The following non-translatable keys held in a separate file
privacyPolicyLink=<h:outputLink target="_blank" value="#{bean.privacyPolicy}">#{messages['privacyPolicy']}</h:outputLink>
cookieNoticeLink=<h:outputLink target="_blank" id="cookieNoticeLink" value="/jsf/Notice.xhtml">\
    #{messages['cookieNotice']}\
    <f:param name="content" value="Cookie-Notice"/>\
    <f:param name="application" value="#{bean.application}"/>\
</h:outputLink>

但是facelet将JSF标记(h:outputLink)作为字符串返回,而不是将它们扩展为HTML标记我可以使用<a>标记,但是我将重写逻辑放在属性文件中,这很难维护

iAgreePhrase=I agree to WorldSite's #{messages['privacyPolicyLink']} and the #{messages['cookieNoticeLink']}
privacyPolicy=Privacy Policy
cookieNotice=Cookie Notice

//The following non-translatable keys held in a separate file
privacyPolicyLink=<a target="_blank" href="#{bean.privacyPolicy}">#{messages['privacyPolicy']}</a>
cookieNoticeLink=<a target="_blank" href="#{contextPath}/#{bean.application}/Notice/Terms-and-Conditions">\
    #{messages['cookieNotice']}</a>

有没有一种方法可以在不必将重写逻辑放入资源包的情况下达到预期效果?我的一些想法是迫使应用程序容器对facelet进行两次处理/重新排序,因此它首先插入资源包,然后扩展JSF标记

或者,我可以在bean中构造重写的URL,然后从我的资源包中调用它


共 (2) 个答案

  1. # 1 楼答案

    虽然Oversteer's answer当然是适用的,但这也可能有帮助。您可以通过EL表达式创建URL,如下所示:

    #{facesContext.externalContext.encodeActionURL('/myapp/Notice/Privacy-Policy')}
    

    要在消息中包含HTML标记,需要在<h:outputText/>中使用escape="false",例如:

    <h:outputText escape="false" value="#{messages['iAgreePhrase']}" />
    

    还有,在你的留言里。属性(或本地化版本):

    iAgreePhrase=I agree to WorldSite's <a href="#{facesContext.externalContext.encodeActionURL('/myapp/Notice/Privacy-Policy')}">Privacy Policy</a> and ...
    

    这有一个问题,即URL只能从HTTP请求中计算,例如,如果在异步线程中使用消息键,则不会计算URL(没有可用的facesContext)

  2. # 2 楼答案

    你似乎把一切都搞错了,我很抱歉地说,我发现这个问题分析得不好,篇幅过长,阅读起来令人困惑

    您应该尝试从JSF标记中使用资源包,而不是相反。在需要参数化消息的地方,可以使用如下构造:

    信息。属性

    nameHeader=My name is {0}
    

    索引。xhtml

    <h:outputFormat value="#{msgs.nameHeader}">
        <f:param value="#{bean.name}"/>
    </h:outputFormat>
    

    如果您有一个这样做不起作用的场景,那么您必须在一个支持bean中构建字符串