CatalystでFormValidator::SimpleとI18Nプラグインを使ってエラーメッセージを国際化対応

適当なやり方なのかはわかりませんが、うまくいったのでやり方を書きます。
それぞれのプラグインについては特に説明しません。

要は、

  • FormValidatorのメッセージに言語リソースのキーを指定する
  • その値を使って、フォーム側でI18Nのlocalizeメソッドを呼んで、テキストを取得する

っていうだけです。

以下にそれぞれの設定ファイルの例を。

messages.yml(FormValidator::Simple のメッセージ設定ファイル)

sample_page:
  keyword01:
    NOT_BLANK: e_keyword01

ja.pm(I18Nの日本語言語リソース)

package MyApp::I18N::ja;
use utf8;
use base 'MyApp::I18N';
our %Lexicon = (
	'e_keyword01'  => 'キーワード1が空です',
);

1;

en.pm(I18Nの英語言語リソース)

package MyApp::I18N::en;
use base 'MyApp::I18N';
our %Lexicon = (
	'e_keyword01'  => 'Keyword1 is empty',
);

1;


実際に動かすときは、こんな感じ。
コントローラ

sub sample_page :Local {
	my ($self, $c) = @_;
	if ($c->req->method eq 'POST' ) {
		if ( $c->form->has_error ) {
			$c->stash->{error} = $c->form;
		} else {
			#エラーじゃなかったときの処理
		}
	}
}

TT

[% IF error.has_error %]
	<ul>
		[% FOREACH message IN error.messages('sample_page') %]
			<li>[% c.localize(message) %]</li>
		[% END %]
	</ul>
[% END %]

これでいけます。