2009-07-30 22 views
4

JSFファイルを国際化する過程で、外部化文字列(およびプレースホルダを使用した文字列の連結)が処理されています。私はJSF(今日と昨日)にはほとんど経験がありませんので、私の質問に対するobviuosの答えがある場合は私に言い訳をしてください!JSF:outputFormatのパラメータとしてのcommandLink

単純なプレースホルダではh:outputFormatタグ(およびf:paramタグ)を使用していましたが、現在はplaceholderをcommandLinkコンポーネントで置き換えようとしています。

<h:outputFormat value="#{adminMsgs.scheduleUpdateLink} "> 
    <h:commandLink value="#{adminMsgs.update}" action="refresh" /> 
</h:outputFormat> 

すなわち、プロパティファイル:これらの線に沿って

scheduleUpdateLink = After waiting a few seconds, please {0} the page. 
update = update 

、出力を:

After waiting a few seconds, please <a href="#" class="..." onclick="...;return false;">update</a> the page. 

この作業(更新リンクは「前に表示されていませんscheduleUpdateLink 'text)、誰かが私がそれをやる方法を知っていますか?

ありがとうございます。

EDIT/UPDATE

お返事マクダウェルをありがとう - まだ非常に便利な、しかし、完全に私の問題を解決していません。私は入力ボックス(h:inputText)で同じことをする必要もありますし、一つのリソース文字列に複数のプレースホルダがある場合もあります。したがって、私は、アラビア語のような順序が同じであることを保証することはできません。

Java関数を使用した場合、文字列としてJSFタグを渡すことができる方法があるかどうかを知っていますか? <h:outputFormat value=..。 facesコンテキストを使用してレンダリングされたHTMLを取得します。これをそれぞれのプレースホルダに挿入してプレーンなHTMLとして返すことができますか?またはこれらの行に沿った他のアイデアですか?

乾杯。

答えて

6

h:outputFormatタグは、私が知る限り、パラメータとしてf:param子のみを使用します。メッセージは、(代わりにh:commandLinkの)リンクであった場合

、あなたはHTMLリテラルを使用することができます。これを行うことによって、のcommandLink:

<h:outputFormat escape="false" 
    value="...seconds, please &lt;a href='etc..." />. 

私は時間をエミュレートしようとしているお勧めしません。 third party libraryのhコマンドラインの豊富なバージョンを見つけることができます。

文字列を2つに分割するだけで、翻訳者の生活が難しくなり、翻訳の品質が低下する可能性があります(特にこれを多くしている場合)。

私はこのようなカスタム関数を使用して見たい:

<f:loadBundle basename="i18n.I18n" var="bundle" /> 
<h:outputText value="#{i18n:fragment(bundle.scheduleUpdateLink, 0)}" /> 
<h:commandLink> 
    <h:outputText value="#{bundle.update}" /> 
</h:commandLink> 
<h:outputText value="#{i18n:fragment(bundle.scheduleUpdateLink, 1)}" /> 

レンダリングされた出力形式は次のとおりです。

After waiting a few seconds, please <script type="text/javascript"><!-- 
    /*JavaScript elided*/ 
//--> 
</script><a href="#" 
     onclick="return oamSubmitForm('someClientId');">update</a> the page. 
関数は、文字列を分割し、静的メソッドによって支えられて

要求されたフラグメントを返します。

public static String fragment(String string, int index) { 
    // TODO: regex probably not complete; ask stackoverflow! 
    // see http://java.sun.com/javase/6/docs/api/java/text/MessageFormat.html 
    final String regex = "\\{\\d.*?\\}"; 
    String[] fragments = string.split(regex, index + 2); 
    return fragments[index]; 
    // TODO: error handling 
} 

あなたのビューの技術(Facelets o R JSP)、関数宣言が若干異なっている。


EDIT:詳細

JSFに基づいて、建物のインターフェイスに宣言的なアプローチを取ります。子を持つ動的なUIを、翻訳された文字列で表示される順序に従って並べ替える必要があります。これらの2つのことは不安ですが、すべてが失われることはありません。

これにはいくつかの方法があります。

  • 上記のテキストを使用するために、以下の入力/管理表(一般的な形式のアプローチ)を使用するようにUIを再設計します。これは最も簡単な解決策ですが、UIデザイナーを満足させるものではありません。
  • binding attribute on a panelを使用して、すべてを作成し、プログラムで並べ替えます。これは、あなたのバッキングビーンにたくさんの反復コードを意味するかもしれません。

  • は、次のようになります再利用可能なカスタムコントロールを作成します。

    <ed:formatPane string="click {0} after filling in forename {1} and surname {2}"> 
        <h:commandLink value="#{bundle.linkMsg}" /> 
        <h:inputText value="#{bean.prop1}" /> 
        <h:inputText value="#{bean.prop2}" /> 
    </ed:formatPane> 
    

    ちょうど時間レンダラを置き換えるために、おそらく可能(と少ない作業)です:代わりにフルカスタムコントロールを作成する任意の子どもたちを支援するためのOUTPUTFORMATが、それは混乱を招く可能性があるので、私はそれに反論したいです長期メンテナンス中に

    誰かが私が示唆したことをするカスタムコントロールを既に書いていることがあります(オリジナルのアイデアはほとんどありません)。

    +0

    これは大きな助けになりました! 私はカスタムコンポーネントatmで作業しています。レンダラーのベースとなるデフォルトのレンダラーを見たいと思っていましたが、見つけられず、グーグルグーグルも見つかりませんでした。 javax.faces.component.html.HtmlOutputFormatのデフォルトレンダラーが何であるか知っていますか?私が知っている唯一のことは、レンダラータイプが "javax.faces.Format"であることです。乾杯と私はあなたのブログをチェックしています... –

    +0

    オープンソースのJSF実装(Sun MojarraとApache MyFaces)は2つあります。実装の設定文書を検索し、レンダラータイプと一致するレンダラークラス要素を検索します。 – McDowell

    +1

    興味のあるカスタムコントロールの実装:http://illegalargumentexception.blogspot.com/2009/08/jsf-custom-format-panel-control-for.html – McDowell

    0

    プレーンテキストがJSFによって正しくレンダリングされるためには、< html:outputText ... >で生成する必要があります(技術的な理由がありません)。私はoutputText、commandLinkとoutputTextでこれを行います。

    一般に、JSF を扱う場合、すべてはプレーンテキストでなければなりません。

    便利なリファレンス:するThorbjörnが言ったように代わりのoutputText >:http://exadel.com/tutorial/jsf/jsftags-guide.html

    +0

    申し訳ありません。これは問題とは何か関係がありますか?もし私が理解できないのなら...リンクのためにありがとう、非常に便利です。 –

    +0

    ChrisADはより詳細に理解し、答えました。 –

    0

    あなたが<時間を使うことができ、あなたの問題を解決するために。

    はBasiclyあなたのコードとプロパティは次のようになるファイル:

    <h:outputText value="#{adminMsgs.scheduleUpdateLink1}" /> 
    <h:commandLink value="#{adminMsgs.update}" action="refresh" /> 
    <h:outputText value0"#{adminMsgs.scheduleUpdateLink2}" /> 
    

    とプロパティは、このようなファイル:

    scheduleUpdateLink1 = After waiting a few seconds, please 
    update = update 
    scheduleUpdateLink2 = the page. 
    

    TBH私はOUTPUTFORMATはのUIComponentで動作すると思ういけないが、テキストのみ。

    関連する問題