1. ホーム
  2. jsf

[解決済み] JSFの国際化、message-bundleとresource-bundleはいつ使うのか?

2023-04-06 03:03:47

質問

いつ、どのように <resource-bundle><message-bundle> のローカライズ用タグを faces-config.xml ? この2つの違いは、私にはあまりよくわかりません。

どのように解決するのですか?

メッセージバンドルです。

この <message-bundle> は、JSFの検証/変換機能で使用されるJSFのデフォルトの警告/エラーメッセージを上書きしたいときに使用します。 デフォルトの警告/エラーメッセージのキーは、2.5.2.4 章の JSF仕様 .

例えば Messages_xx_XX.properties の中のファイル com.example.i18n パッケージの中で、以下のようにデフォルトの required="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>

この <resource-bundle> を指定することなく、JSFアプリケーション全体で利用可能なローカライズされたリソースバンドルを登録したい場合に使用されます。 <f:loadBundle> を指定する必要はありません。

例えば 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 Bean Validation APIもあり、これらは以下のように表されます。 @NotNull , Size , @Max などのアノテーションは javax.validation.constraints パッケージのアノテーションです。このAPIは 全く関係ありません。 であることを理解する必要があります。JSFの一部ではないのですが、JSFは偶然にも をサポートしています。 をサポートしています。つまり、JSR303の実装(例えばHibernate Validator)の存在を判断・認識し、検証をそれに委ねるのです(無効化するには <f:validateBean disabled="true"/> を使用することで無効にできます)。

の4.3.1.1章にあるように JSR303 仕様 に従って、カスタム JSR303 検証メッセージファイルには、以下のものが必要です。 まさに 名前 ValidationMessages_xx_XX.properties に配置する必要があり ルート に配置する必要があります(したがって、パッケージ内ではありません!)。


ローカライゼーション

上記の例では _xx_XX は(オプションの)言語と国コードを表しています。これが全くない場合は、デフォルト(フォールバック)バンドルとなります。言語が存在する場合、例えば _en のように言語がある場合は、クライアントが明示的に Accept-Language HTTP リクエストヘッダで明示的に要求された場合に使用されます。国名についても同様で、例えば _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におけるローカライゼーション、リクエスト/ビューごとではなくセッションごとに選択されたロケールを記憶する方法 .