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

时间:2012-09-14 13:57:11

标签: java jsf seam resourcebundle

Enviornment: JSF 2.1.7 SEAM 2.3.0 JBOSS 5.1.2

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

  

“我同意WorldSite的隐私政策 Cookie通知

斜体隐私政策 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”和“和”键中)

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 个答案:

答案 0 :(得分:3)

你似乎已经走错了方向,我很遗憾地说我发现这个问题分析不当,过长而且难以阅读。

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

<强> messages.properties

nameHeader=My name is {0}

<强>的index.xhtml

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

如果您的方案不起作用,则必须在辅助bean中构建字符串。

答案 1 :(得分:1)

虽然Oversteer's answer肯定适用,但这也可能有用。您可以从EL表达式创建URL,如下所示:

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

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

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

并且,在您的messages.properties(或本地化版本)中:

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

这就存在URL只能在HTTP请求中计算的问题,例如,如果您在异步线程中使用消息密钥,则不会计算URL(没有facesContext可用)。