CakePHP 2.0系でValidation時のエラーメッセージを日本語化する

投稿日: 2013/3/28 14:41

CakePHPにはデータをPOSTした際に各項目をModelに定義された入力制約に基づいてチェックし、
制約違反になった場合にエラーメッセージを表示してくれる機能があります。

CakePHP1.3まではうまく動かなかったので適当にModelの関数をカスタムして
泥臭い方法でどうにかこうにか動かしていたのですが、
2.0系にアップデートするとまた動かなくなったため抜本的にやり方を見直しました。

あまりドキュメントが整理されていないのか他の人の同じような記事を見なかったので
後続の方のために残しておきます。

まずはModelの制約を記述します。

[php]
class MyModel extends AppModel {
public $validate = array(
‘name’ => array(
‘notempty’ => array(
‘rule’ => array(‘notempty’),
//’message’ => ‘Your custom message here’,
//’allowEmpty’ => false,
//’required’ => false,
//’last’ => false, // Stop validation after this rule
//’on’ => ‘create’, // Limit validation to ‘create’ or ‘update’ operations
),
),
);
}
[/php]

上のコードはBakeで出力したものほぼそのままです。
この場合、nameの項目に対してnotempty制約(入力必須)をかけています。

message の文字列を自分で変更すれば好みのメッセージを出せるのですが、
notempty や numeric など何回も使う物の場合毎回書くのが面倒になります。
しかし標準では message を省略(コメントアウトしたまま)にすると
エラー発生時に「notempty」とだけエラーが表示されてしまいます。

これはどうしたものかと思って色々試してみたのですが、
結局i18nの国際化で対応していたみたいです。

Locale ディレクトリの default.pot ファイルを生成するために
app/Console ディレクトリで php cake.php i18n をコマンドラインから実行します。

すると1.3系まではValidateのMessageまでは読んでくれなかった記憶があるのですが、
2.0系ですとModelのvalidate変数まで読んでpotファイルを生成してくれました。
具体的にはある列に
‘message’ => ‘My Validation Error’
のメッセージを指定した制約をかけた場合、
default.potファイルに
「My Validation Error」の項目が追加されました。

また、notemptyやnumericなどの制約にメッセージを指定せずそのままにしていた場合、
「notempty」や「numeric」という項目がpotファイルに追加されました。

上記の「My Validation Error」「notempty」「numeric」等の項目に
default.moファイルで対応する日本語を追加してやると上手く日本語にして表示してくれました。

なんとなくこの方法がスマートなのでおそらく推奨の手順なのではないかと思います。