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 
privacyPolicy=Privacy Policy
and= and 
cookieNotice=Cookie Notice
但是这需要一些语言的解决方法(在“iAgreeTo”和“和”键中)
iAgreeTo=J'accepte la 
privacyPolicy=Politique de la vie privée
and= de WorldSite et les 
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,然后从我的资源包中调用它?
答案 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可用)。