3

環境:JSF 2.1.7 SEAM 2.3.0 JBOSS 5.1.2

私のアプリケーションには、ローカライズする必要のある文字列があります

「WorldSiteのプライバシーポリシーCookieに関する通知に同意します」

イタリック体のプライバシーポリシーCookie通知が他のページへのハイパーリンクである場合。

もともと私たちのフェイスレットは次のように設定されていました:

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

注:/jsf/Notice.xhtmlを取得して次のように書き換えるURL書き換えがあります。

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>

ただし、ファセットは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>

リソースバンドルに書き換えロジックを配置せずに、目的の効果を達成する方法はありますか?私が持っているいくつかの考えは、アプリケーションコンテナにファセットレットを2回処理/並べ替えることを強制しているため、最初にリソースバンドルを挿入してから、JSFタグを展開します。

または、Beanで書き換えられたURLを作成し、それをリソースバンドルから呼び出すことができる場合がありますか?

4

2 に答える 2

3

あなたはすべてを間違った方向に進めているようです。申し訳ありませんが、質問の分析が不十分で、長すぎて、読むのが混乱していることがわかりました。

あなたがやろうとしているのは、JSFタグ内からのリソースバンドルを使用することであり、その逆ではありません。メッセージをパラメーター化する必要がある場合は、次のような構成を使用します。

messages.properties

nameHeader=My name is {0}

index.xhtml

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

これが機能しないシナリオがある場合は、バッキングBeanで文字列を作成する必要があります。

于 2012-09-14T15:19:39.773 に答える
1

オーバーステアの答えは確かに当てはまりますが、これも役立つ可能性があります。次のようなEL式からURLを作成できます。

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

escape="false"メッセージにHTMLマークアップを含めるには、次のように使用する必要があります<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がありません)。

于 2012-09-17T13:53:21.633 に答える