Play 2.0 RC3 で i18n を行う場合、他の Web アプリケーションフレームワークに比べてちょっと違うかなと思ったところがあったのでメモ。
まず、自分のアプリケーションの conf/messages でメッセージ定義するのは多分ナシ。
なぜかといいますと、Play そのもの(play_2.9.1.jar)が持っている messages のほうが優先されるので、たとえば、
contraint.required=必須
みたいなことをやっても「Required」というもともとのメッセージが表示されてしまいます。
ではどうすれば良いかといいますと、明示的にロケールを指定してやればOK。ただしこれにも癖があります。
リソースバンドルを使い慣れた Java プログラマは、ロケールが ja_JP ならば messages_ja_JP または messages_ja が読み込まれるのではないかと当たりをつけることでしょう。Github 上の Wiki によればファイル名とロケールのセパレータはアンダースコアではなくピリオドなのでロケールを指定するときは messages.ja のように書けばいいことがわかります。
ところがここがハマりポイント! ロケールが ja_JP のとき、このファイルは読み込まれません!なんと、ja と ja_JP は Play では別物なのです!
しかも、Java では ja_JP とロケールを表記するのは当たり前ですが、Play では ja-JP と書き表します。
ということで、メッセージの定義は messages.ja-JP で行うのが無難そうです。