バリデーションメッセージのカスタマイズと日本語リソース

Tapestry 5では入力のバリデーションをアノテーションで設定できるようになっています。入力値のsetterメッソッドに @Validate("required") とアノテーションするだけで、次のようなエラーメッセージを出してくれます。

ここまではとても簡単でよいのですが、実際に使う上ではメッセージをカスタマイズしたり日本語化する必要があるのでその方法を調べてみました。Tapestry5を試すに書いたQuickstart Archetypeでプロジェクトを作成し、Tapestry5で日本語を使う方法のメソッドを追加した状態を前提に書きます。


まず、上のスクリーンショットのフォームを準備するため、Start.html, Start.java をそれぞれ以下のように編集します。

<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd">
    <head>
        <title>myapp Start Page</title>
    </head>
    <body>

        <form t:type="form" clientValidation="false">
            <t:errors/>
            <label t:type="label" for="emailAddress"/>
            <input t:type="textfield" t:id="emailAddress" value="emailAddress"/>
            <input t:type="submit"/>
        </form>

    </body>
</html>
package org.example.myapp.pages;

import org.apache.tapestry.annotations.Persist;
import org.apache.tapestry.beaneditor.Validate;

public class Start {

    @Persist
    private String _emailAddress;

    public String getEmailAddress() {
        return _emailAddress;
    }

    @Validate("required")
    public void setEmailAddress(String emailAddress) {
        _emailAddress = emailAddress;
    }

}

これを実行し、何も入力せずにサブミットボタンを押せば上のスクリーンショットと同じエラーメッセージが表示されると思います。

ラベルをカスタマイズする

Screencast#4にも出てきますが、まずはここから。メッセージカタログ Start.properties を作成し、次のように「コンポーネントID-label=ラベル」という書式で書きます。

emailaddress-label=E-Mail

Start クラスと同じパッケージに作成しますが、リソースファイルなので src/main/resources 以下に配置します。EclipseではPackage Explorer上で次のようになっていればOKです。

jettyを再起動すると、ラベルが「Email Address」から「E-Mail」に変わります(ファイルを追加した時はjettyの再起動が必要です。その後の編集は再起動なしに反映されます)。エラーメッセージも「You must provide a value for E-Mail.」となります。

バリデーションメッセージをカスタマイズする

「You must provide a value for」の部分をカスタマイズするには、先ほど作成した Start.properties に次の1行を追加します。

emailaddress-required=%s is required.

これでバリデーションメッセージは「E-Mail is required.」と表示されます。つまり、メッセージカタログに「コンポーネントID-バリデータ名=メッセージ文」と記述しておけば、そのメッセージ文が表示されるというわけです。

しかしこの方法だと、デフォルトのメッセージが気に入らない場合は各コンポーネントで繰り返しこれを行わなければなりません。そこで、次のようにしてデフォルトのメッセージを変更することもできます。

デフォルトのバリデーションメッセージを変更する

AppModule.java に次のメソッドを追加します。

public void contributeValidationMessagesSource(Configuration<String> configuration) {
    configuration.add("org/example/myapp/ValidationMessages");
}

org/example/myapp/ValidationMessages.properties を src/main/resources 以下に作成し、次のようにメッセージ文の設定をします。新しいファイルを追加したのでまたjettyを再起動してください。

required=%s is required.

コンポーネントIDを指定せず「バリデータ名=メッセージ文」という書式になります。

日本語リソースを用意する

Start.properties に対して Start_ja.properties、ValidationMessages.properties に対して ValidationMessages_ja.properties が日本語リソースとなるので、それぞれを次のように作成します。

emailaddress-label=Eメール
required=%sは必須項目です。

そして、日本語ロケールを有効にするために AppModule.java の contributeApplicationDefaults メソッド内での設定を en から ja,en に変更します。

configuration.add("tapestry.supported-locales", "ja,en");

jettyを再起動し「Eメールは必須項目です。」と表示されることを確認します。

エラーメッセージの見出し文をカスタマイズする

Start.html の Errors コンポーネント() に banner パラメータを指定します。

<t:errors banner="message:banner"/>

Start_ja.properties に見出し文を記述します。(Start.properties にも)

banner=入力内容に不備があります。

残念ながら、エラーメッセージの見出し文のデフォルトを変更する方法は今のところ無さそうです。ただし日本語だけであれば、 org/apache/tapestry/corelib/components/Errors_ja.properties を用意し、

default-banner=入力内容に不備があります。

とすれば、日本語のデフォルト見出しとすることができます。通常はこちらの方法で問題無いでしょう。


これでバリデーションメッセージのカスタマイズおよび日本語化が一通りできました。確認のため、Eclipse上で見たメッセージカタログの配置を示しておきます。


今回、カスタムバリデータの使用方法も一緒に調べたので、次はそれを書こうと思います。