エラーメッセージの日本語化
最後に、フォームに間違った値を入力した場合に表示されるメッセージを日本語で表示する方法について説明します。これらのメッセージは通常は英語で表示されますが、Zend_Translateモジュールを使うことで"翻訳"された状態で出力することができます。
ここでは単純な例として、上のサンプルであったメッセージを日本語化することにします。サンプルでは Alnum バリデータ、Regexバリデータ、そしてNotEmptyバリデータ(setRequired) が使われていました。それぞれが出しうるエラーは次のとおりです。
バリデータ | エラーメッセージ |
Alnum | '%value%' has not only alphabetic and digit characters |
Regex | '%value%' does not match against pattern '%pattern%' |
NotEmpty | Value is empty, but a non-empty value is required |
どのようなバリデータがどのようなメッセージを出力するかについては、各バリデータクラスの_messageTemplates
変数を調べることでわかります。
ここで、AlnumとRegexの出力するエラーがフォームの内容やユーザの入力に左右されるため、変数(%で囲まれた %value% と %pattern%)を含むことに注意して下さい。なお %value% はユーザからの入力、 %pattern% が Regexに与えられた引数です。
さて、この英語のメッセージを日本語に翻訳してくれる仕組みがZend_Translateです。Zend_Translateには、あらかじめ元のメッセージと対応する翻訳されたメッセージを登録しておけば、必要に応じて翻訳されたメッセージを出力してくれます。
次の例ではIndexControllerのinit
メソッドでZend_Translateのインスタンスを作成し、このインスタンスを利用するようZend_Formを設定する方法を示しています(リスト11)。
... public function init() { $adapter = new Zend_Translate('array', array('Value is empty, but a non-empty value is required' => 'ここの値が空です。', "'%value%' has not only alphabetic and digit characters" => "'%value%' に英数字以外の文字が含まれています", "'%value%' does not match against pattern '%pattern%'" => "'%value%' は '%pattern%' にマッチしません。", ) , 'ja'); Zend_Form::setDefaultTranslator($adapter); ... }
Zend_Translateを作成する方法にはいくつかありますが、今回の例では一番手軽なarrayを利用しました。これは、原文と翻訳された文を組にしたarrayを利用して作成します。次に、Zend_FormのクラスメソッドsetDefaultTranslator
で作成したZend_Translateのインスタンスを登録します。この方法では、エラーメッセージ以外にもZend_Translateでマッチするメッセージがあった場合には翻訳されます。これでエラーのある入力に対する出力は図6のようになります。
なお、翻訳の範囲には他にもエラーメッセージのみ・特定のフォームやフォーム要素のみに限定することも可能です(リスト12)。
//エラーメッセージのみ Zend_Validate_Abstract::setDefaultTranslator($adapter); //フォームのみ Zend_Form::setDefaultTranslator($adapter); //特定のフォームのみ $form->setTranslator($adapter); //特定のフォーム要素のみ $element->setTranslator($adapter);
まとめ
今回はZend_Formの機能について詳細に触れてみました。次回はZend_Layoutを紹介する予定です。Zend_Layoutはいわゆるレイアウト機能を提供するモジュールで、ビューモデルを更に二段階に分けて提供します。