当前位置: 首页 > 知识库问答 >
问题:

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

岑俊弼
2023-03-14

环境:JSF2.1.7Seam2.3.0JBoss5.1.2

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

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

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

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

<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标记。我可以使用

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

祁建明
2023-03-14

虽然转向过度的回答肯定是适用的,但这也可能有帮助。您可以通过EL表达式创建URL,如下所示:

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

要在消息中包含HTML标记,您需要在

<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)。

柳涵映
2023-03-14

你似乎把一切都弄错了,很抱歉不得不说,我发现这个问题分析得很差,太长,读起来很混乱。

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

messages.properties

nameHeader=My name is {0}

index.xhtml

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

如果您有一个不起作用的场景,您将不得不在后备bean中构建字符串。

 类似资料:
  • 在资源包中搜索标签时,如何重写Java的顺序?取自单据,默认顺序如下: 但是,我希望通过先获取变体来覆盖此顺序,如下所示: 我定义了一个扩展类的新类,您可以在其中设置父捆绑包,但我不知道该类何时被实例化,以及在中更改语言时会发生什么。有可能以某种方式推翻命令吗?

  • 问题内容: 我知道还有其他针对同一问题的问题,但问题是解决方案对我不起作用。我有一个小工具,它应该读取我想拥有的文件并将其打包为资源,并依赖于其他我希望将其作为jar而不是单个类的项目(我正在使用Eclipse Helios)。 作为Eclipse中的应用程序,我可以通过以下方式访问资源 当且仅当将资源文件夹放置在输出路径(已编译的源)下时,并且如果将其放置在src文件夹中时,则不是这样。 当我打

  • 在java fx中,使用< code>%key符号的组件可以使用i18n标签。 比如说- 是否可以对组件值使用i18n? 以下代码不起作用-

  • 我正在移动我们的JSF消息。属性,以便QA和ops人员可以修改消息,而无需生成新的war。 我创建了一个JBoss 7模块,并将messages.properties文件放在$JBOSS_HOME/模块/com/acme/收入/main/messages.properties.我更新了jboss-deployment-structure.xml以包含 我放了一个模块。$JBOSS\u HOME/m

  • 问题内容: 我有作为Java类的资源束,可从数据库中读取值。当我更新数据库时,我需要重新加载捆绑软件,但我不知道如何。有人帮忙吗? 鉴于我使用捆绑如下: 问题答案: 要么 调用此方法将重新加载资源,它将刷新包 参考

  • 在尝试从本机使用gui后,日志中有以下消息:2017-03-16 15:23:25.509 MyApplication[32748:1247180]警告:试图显示其视图不在窗口层次结构中!