5

Faceletsには、他の方法で JSF を使用して行うことができる、よりきちんとした、またはより読みやすい国際化されたユーザー インターフェイスのテキスト ラベルのための機能がありますか?

たとえば、単純な JSF では、h:outputFormat を使用すると、メッセージ内の変数を補間する非常に冗長な方法になります。

明確化:次のようなメッセージ ファイル エントリを追加できることはわかっています。

label.widget.count = You have a total of {0} widgets.

これを (Seam を使用している場合) 次のように表示します。

<h:outputFormat value="#{messages['label.widget.count']}">
   <f:param value="#{widgetCount}"/>
</h:outputFormat>

しかし、それは 1 つの文を出力するのに非常に煩雑です。これは、JSF に悪い名前を付けるようなものです。

4

7 に答える 7

5

Seamを使用しているため、メッセージファイルでELを使用できます。

財産:

label.widget.count = You have a total of #{widgetCount} widgets.

XHTML:

<h:outputFormat value="#{messages['label.widget.count']}" />

これは引き続きoutputFormatを使用しますが、冗長性は低くなります。

于 2008-09-19T08:31:51.047 に答える
3

独自のfacesタグライブラリを作成して、次のように冗長性を減らすことができます。

<ph:i18n key="label.widget.count" p0="#{widgetCount}"/>

次に、ビューディレクトリにtaglibを作成します:/components/ph.taglib.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE facelet-taglib PUBLIC "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" "https://facelets.dev.java.net/source/browse/*checkout*/facelets/src/etc/facelet-taglib_1_0.dtd">

<facelet-taglib xmlns="http://java.sun.com/JSF/Facelet">
    <namespace>http://peterhilton.com/core</namespace>

    <tag>
        <tag-name>i18n</tag-name>
        <source>i18n.xhtml</source>
    </tag>

</facelet-taglib>

/components/i18n.xhtmlを作成します

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:h="http://java.sun.com/jsf/html"        
    xmlns:f="http://java.sun.com/jsf/core">

    <h:outputFormat value="#{messages[key]}">
            <!-- crude but it works -->
        <f:param value="#{p0}" />
        <f:param value="#{p1}" />
        <f:param value="#{p2}" />
        <f:param value="#{p3}" />
    </h:outputFormat>

</ui:composition>

少し調べれば、議論を渡すためのエレガントな方法を見つけることができるでしょう。

次に、新しいtaglibをweb.xmlに登録します

<context-param>
<param-name>facelets.LIBRARIES</param-name>
<param-value>
        /components/ph.taglib.xml
    </param-value>
</context-param>

ビューに追加xmlns:ph="http://peterhilton.com/core"するだけで、準備は完了です。

于 2009-03-17T23:11:09.247 に答える
3

Seam Interpolator を使用できます。

<h:outputText value="#{interpolator.interpolate(messages['label.widget.count'], widgetCount)}"/>

@BypassInterceptors があるため、パフォーマンスは問題ありません。

于 2009-04-07T12:10:33.080 に答える
3

私はこれについてもっと考えていましたが、メッセージキーと可変数のパラメーターを取る独自の JSTL 関数をおそらく記述できると思いました。

<h:outputText value="#{my:message('label.widget.count', widgetCount)}"/>

メッセージ関数が出力前に結果を HTML エンコードする場合、h:outputText を使用する必要さえありません。

#{my:message('label.widget.count', widgetCount)}
于 2008-09-19T07:35:59.387 に答える
3

outputFormat 以外の別の方法に出くわしたことはありません。残念ながら、かなり冗長です。

他に提案できる唯一のことは、バッキング Bean でメッセージを作成し、messageFormat ではなくそれを出力することです。

私の場合、Spring の MessageSource を JSF と統合しています ( MessageSourcePropertyResolverを使用)。次に、バッキング Bean でパラメーター化されたメッセージを取得するのはかなり簡単です。ユーザーがいるロケールを知るだけで済みます (ここでも、ロケールをバッキング Bean プロパティにバインドして、JSF または Java 経由でアクセスできるようにしています)。

パラメーター (特にメッセージ) は、JSF が本当に改善できることの 1 つだと思います。

于 2008-09-18T14:46:45.130 に答える
-1

ResourceBundle とプロパティ ファイルを使用します。

于 2008-09-18T13:07:06.697 に答える