Zend_Validate の日本語の翻訳ファイル

Zend_Validate はデフォルト英語のメッセージが表示される。
バリデーションには Zend_Fileter_Input を使っていて、メッセージを自由に設定できる。

<?php
$validations = array(
    'email' => array(
         new Zend_Validate_EmailAddress(),
         new Zend_Validate_StringLength(1, 255),
         'message' => array(
             0 => 'メールアドレスではありません',
             1 => '1 文字以上 255 文字以内で入力して下さい。',
         )
     )
);

上記のような感じでできるが、たとえばメールアドレスのホスト名の形式が場合は、Zend_Validate_EmailAddress() の内部でエラーになり、「メールアドレスではありません。」というエラーメッセージが出てこなかった。


Zend_Validate のデフォルトのエラーメッセージは各バリデーションライブラリの内部で定数として持っている。
このメッセージを変更するにはいくつか方法があって、バリデーションクラスを継承してメッセージを上書きする方法がある。
Twk さんが以前 CodeRepos にあげていた方法。
/lang/php/ZendFramework_ext/library/Twk/Validate - CodeRepos::Share - Trac

または Zend_Transelate のアダプターにクラスを突っ込むという方法。
/lang/php/ZendFramework_ext/library/Twk/Translate/Ja.php - CodeRepos::Share - Trac


自分は Zend_Form は使わないし、クラスを上書きするのは手間がかかると思ったので他の方法を調べた。
http://www.newbreed-web.net/blog/?p=177


結局一番良さそうなのが、Zend_Validate_Abstract にある setDefaultTranslator() というメソッドに Zend_Transelate オブジェクトを突っ込む方法が既存のコードをいじらず出来そうだった。
Zend_Filter_Input との連携も以下のような感じにしてやれば出来た。

<?php
// $translate は Zend_Translate オブジェクトで日本語ファイルのアダプターをもっている。
Zend_Validate_Abstract::setDefaultTranslator($translate);
$validations = array(
    'email' => array(
         new Zend_Validate_EmailAddress(),
         new Zend_Validate_StringLength(1, 255),
         'message' => array(
             0 => 'メールアドレスではありません',
             1 => '1 文字以上 255 文字以内で入力して下さい。',
         )
     )
);

参考にしたサイトは gettext を使用しているようだったが、翻訳ファイルは、.ini を使った。
ドキュメントでは推奨してないし、gettext を使うのがいいのかもしれないけど、アプリケーションのメッセージは ini ファイル形式で管理しているし修正がしやすいため。


で、肝心のメッセージを日本語化してみた。
ベースは Twk さんので、足らなかったり、色々付け加えたりしている。
誤訳や、こうした方が良いというのがあれば是非リクエスト下さい。
gene/validate.ini at master · heavenshell/gene · GitHub


なお、メッセージの一部は ini 形式で読み込んだら不具合が起きるので、定数になっている所もある。
ただし、Zend Framework1.10 になったらメッセージ自体変わるし追加になるのもあるので、バージョンアップした際は現行のは使えなくする予定。