ビューに直接メッセージを日本語で書けば表示できるのですが、
動的にメッセージを変えたいような場合に、

$params = array( array('message'=>'エラーです') );
$this->cakeError('foo', $params);

とし cakeError に日本語のメッセージをパラメータとして渡しても表示できません。
原因は /cake/libs/error.php のコンストラクタで

$clean = new Sanitize();
$messages = $clean->paranoid($messages, $allow);

となっていて、パラメータをサニタイズしていて半角英数字以外は削除されてしまいます。
ちなみに Sanitize::paranoid メソッドは
/cake/libs/sanitize.php

function paranoid($string, $allowed = array()) {
    $allow = null;
    if (!empty($allowed)) {
        foreach($allowed as $value) {
            $allow .= "\\$value";
        }
    }

    if (is_array($string)) {
        foreach($string as $key => $clean) {
            $cleaned[$key] = preg_replace("/[^{$allow}a-zA-Z0-9]/", "", $clean);        }
    } else {
        $cleaned = preg_replace("/[^{$allow}a-zA-Z0-9]/", "", $string);
    }
    return $cleaned;
}

のようになっています。半角英数字と $allow で許可した文字以外は削除されます。

前回の投稿「cakeError でエラー処理」のように自分で cakeError 処理を書いた場合には /app/error.php でコンストラクタを上書きして問題の部分をコメントアウトすることにより、日本語を表示することができるようになります。

/cake/libs/error.php の __construct メソッドを丸ごと /app/error.php にコピペして
parent::__construct();
$messages = $clean->paranoid($messages, $allow);の2行をコメントアウト

こうすることにより日本語を表示することができるようになりました。

※サニタイズ処理をコメントアウトしていますので、その点は十分に注意が必要です。

関連する投稿