JSFでの国際化、メッセージバンドルとリソースバンドルをいつ使用するか?


84

ローカリゼーションにタグをいつどのように使用する必要が<resource-bundle>あり<message-bundle>ますfaces-config.xmlか?これら2つの違いは私にはあまり明確ではありません。

回答:


148

<メッセージバンドル>

これ<message-bundle>は、JSF検証/変換関連で使用されるJSFのデフォルトの警告/エラーメッセージを上書きする場合に使用されます。デフォルトの警告/エラーメッセージのキーは、JSF仕様の2.5.2.4章にあります。

たとえば、デフォルトのメッセージを上書きする以下のパッケージMessages_xx_XX.properties内のファイル:com.example.i18nrequired="true"

com/example/i18n/Messages_en.properties

javax.faces.component.UIInput.REQUIRED = {0}: This field is required

com/example/i18n/Messages_nl.properties

javax.faces.component.UIInput.REQUIRED = {0}: Dit veld is vereist

次のように構成できます(ロケール指定子_xx_XXとファイル拡張子なしで!):

<message-bundle>com.example.i18n.Messages</message-bundle>

<リソースバンドル>

これ<resource-bundle><f:loadBundle>、すべてのビューで指定する必要なしに、JSFアプリケーション全体で使用できるローカライズされたリソースバンドルを登録する場合に使用されます。

たとえば、次のようなパッケージText_xx_XX.properties内のファイルcom.example.i18n

com/example/i18n/Text_en.properties

main.title = Title of main page
main.head1 = Top heading of main page
main.form1.input1.label = Label of input1 of form1 of main page

com/example/i18n/Text_nl.properties

main.title = Titel van hoofd pagina
main.head1 = Bovenste kop van hoofd pagina
main.form1.input1.label = Label van input1 van form1 van hoofd pagina

次のように構成できます(ロケール指定子_xx_XXとファイル拡張子なしで!):

<resource-bundle>
    <base-name>com.example.i18n.Text</base-name>
    <var>text</var>
</resource-bundle>

main.xhtml次のように使用されます。

<h:head>
    <title>#{text['main.title']}</title>
</h:head>
<h:body>
    <h1 id="head1">#{text['main.head1']}</h1>
    <h:form id="form1">
        <h:outputLabel for="input1" value="#{text['main.form1.input1.label']}" />
        <h:inputText id="input1" label="#{text['main.form1.input1.label']}" />
    </h:form>
</h:body>

ValidationMessages(JSR303 Bean Validation)

Java EE 6 / JSF 2ので、また、それらによって表される新しいJSR303ビーン検証APIがあります@NotNullSize@Maxの、などの注釈をjavax.validation.constraintsパッケージ。このAPIはJSFまったく関係がないことを理解する必要があります。これはJSFの一部ではありませんが、JSFは検証フェーズでたまたまサポートしています。つまり、JSR303実装(Hibernate Validatorなど)の存在を判別して認識し、検証をそれに委任します(<f:validateBean disabled="true"/>ちなみに、を使用して無効にすることができます)。

JSR303仕様の4.3.1.1章にあるように、カスタムJSR303検証メッセージファイルは正確な名前を持ってValidationMessages_xx_XX.propertiesいる必要があり、クラスパスのルートに配置する必要があります(したがって、パッケージではありません!)。


ローカリゼーション

上記の例では_xx_XX、ファイル名のは(オプションの)言語と国コードを表しています。これがまったく存在しない場合は、デフォルト(フォールバック)バンドルになります。たとえば、言語が存在する_en場合、クライアントがAccept-LanguageHTTPリクエストヘッダーでこの言語を明示的にリクエストしたときに使用されます。同じことが国にも当てはまります。例:_en_USまたは_en_GB

メッセージとリソースバンドルの両方でサポートされているロケールを、の<locale-config>要素で一般的に指定できますfaces-config.xml

<locale-config>
    <default-locale>en</default-locale>
    <supported-locale>nl</supported-locale>
    <supported-locale>de</supported-locale>
    <supported-locale>es</supported-locale>
    <supported-locale>fr</supported-locale>
</locale-config>

目的のロケールは、を介して設定する必要があります<f:view locale>リクエスト/ビューごとではなくセッションごとに選択したロケールを記憶する方法については、JSFでのローカリゼーションも参照してください。


1
こんにちはBalusC、複数の<message-bundle>を使用できますか?JavaBeanから呼び出す方法はありますか?
T8Z 2014年

<resource-bundle>を使用する場合は、フォルダー構造に特別な注意を払う必要があります。faces-config.xml <resource-bundle> <base-name> org.abc.def.messages </ base-name> <var> msg </ var> </ resource-bundle>に次の情報がある場合すべてのmessage.properties、message_es.properties、message_de.propertiesは、「src / main / resources / org / abc / defフォルダー」にのみ存在する必要があります。つまり、「def」フォルダの下に「messages」フォルダを作成しないでください。'def'までは、resource-bundleがすべてのmessages_xx.propertiesファイルを見つけることを期待している場所です。
ラウールサイニ2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.