2010年5月3日月曜日

Zend_Validateのメッセージを日本語化

※参考
http://framework.zend.com/manual/ja/zend.validate.introduction.html
http://framework.zend.com/manual/ja/zend.validate.messages.html

Zend Framework標準のバリデータはちゃんと使いこなせばすごく便利なのですが、デフォルトのエラーメッセージは英語になっています(当然ですが)。

実際に使用する際には日本語化する必要がありますし、また、標準のメッセージを改変しないといけないこともままあります。
このメッセージを日本語化するのがやや面倒で、以下のようなコードを記述する必要があります。

$validator = new Zend_Validate_StringLength(array('encoding' => 'utf8', 'min' => 0, 'max' => 40));
$validator->setMessage('文字列 \'%value%\'は%min%文字以上 %max%文字以下で入力してください。');

メッセージは200個ほどあるようですし、バリデータ生成するたびにメッセージ設定していればそれこそやってられません。

Zendのドキュメントにメッセージを一括で多言語化する方法が記載されていましたが、そこで紹介されているコードでは動作しない部分がありましたので以下メモ。

Zend Framework is shipped with more than 45 different validators with more than 200 failure messages. It can be a tendious task to translate all of these messages. But for your convinience Zend Framework comes with already pre-translated validation messages. You can find them within the path /resources/languages in your Zend Framework installation.
So to translate all validation messages to german for example, all you have to do is to attach a translator to Zend_Validate using these resource files.

$translator = new Zend_Translate(
'array',
'/resources/languages',
$language,
array('scan' => Zend_Locale::LOCALE_DIRECTORY)
);
Zend_Validate_Abstract::setDefaultTranslator($translator);

※参考「http://framework.zend.com/manual/ja/zend.validate.messages.html」より


1. 言語ファイルの取得

ZendFramework-1.10.4/resources/languages
に多言語化ファイルが含まれています。

ただ、Full Packageにしか含まれていないようです。
ダウンロードした資材に言語ファイルが含まれていなければ、リポジトリから取得するかFull Packageをダウンロードします。

・リポジトリ:http://framework.zend.com/code/browse/Zend_Framework
/standard/trunk/resources/以下のファイル
・パッケージ:http://framework.zend.com/download/latest


2. 言語ファイルの配置

日本語にしたい場合、必要なのは以下のファイルのみです。
ZendFramework-1.10.4/resources/languages/ja/Zend_Validate.php

任意の場所に言語ファイルを配置します。

後からメッセージも変更することでしょうし、ここではZendのインストールディレクトリではなく以下のアプリケーションディレクトリ配下に配置することとします。
/APP_ROOT/library/lang/Zend_Validate.php


3. 言語ファイルのロード

言語ファイルをロードし、Zend_Validateのメッセージを日本語化します。
これもどこで行ってもいいわけですが、Bootstrapで実行することにします。

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initLang()
    {
        // 言語ファイルのロード
        $translator = new Zend_Translate(
            // Arrayアダプタを使って言語定義を取得
            'array',
            // 言語リソースのパス
            realpath(APPLICATION_PATH . '/../library/lang/Zend_Validate.php'),
            // 日本語ロケール
            'ja',
            // ファイル指定してますよー
            array('scan' => Zend_Translate::LOCALE_FILENAME)
        );
        // デフォルトのトランスレータを設定
        Zend_Validate_Abstract::setDefaultTranslator($translator);
    }
}

バージョンが違うのかもしれませんが、Zendのリファレンスに記載されている以下のコードでは動作しませんでした(Zend1.10.4)。

$translator = new Zend_Translate(
    'array',
    // インクルードパスの問題かもしれないが、フルパスでないと見れなかった。
    '/resources/languages',
    $language,
    // Zend_Locale::LOCALE_DIRECTORYなんて無い。
    // Zend_Translate::LOCALE_DIRECTORYの間違い?
    array('scan' => Zend_Locale::LOCALE_DIRECTORY)
);
Zend_Validate_Abstract::setDefaultTranslator($translator);


4. バリデートしてみる

class HogeController extends Zend_Controller_Action
{
    public function fugaAction()
    {
        $validator = new Zend_Validate_StringLength(array('min' => 0, 'max' => 3));
        $errors = array();
        if (!$validator->isValid('12345')) {
            foreach ($validator->getMessages() as $messageId  => $message) {
                $errors[] = $message;
            }
        }
        var_dump($errors);
        exit;
    }
}

・多語化前
array(1) {
  [0]=>
  string(38) "'12345' is more than 3 characters long"
}

・多語化後
array(1) {
  [0]=>
  string(39) " '12345' は 3 文字より長いです"
}

となればOK。
後は、言語ファイルを直接編集していけばメッセージの変更も一箇所で管理可能。

2 件のコメント:

  1. Zend Framework のマニュアル更新の負荷に個人では耐えられなくなったため、残念ながら撤退いたしました。今後は英語版を参照されることをお勧めします。
     
    更新状況
    http://mikaelkael.dyndns.org/checker/language/details/lang/ja

    返信削除
  2. コメントありがとうございました。

    Zend_Validate.phpの資材で翻訳できないものがありましたので、メモ。

    翻訳資材のコミット権限持ってらっしゃる方、どなかた気付いたら対応お願いしますm(_ _)m

    // Zend_Validate_PostCode
    "Invalid type given, value should be string or integer" => "不正な形式です。値は文字列または数値である必要があります",
    "'%value%' does not appear to be an postal code" => " '%value%' は郵便番号でないようです",



    // Zend_Validate_PostCode - v1.10.4
    "Invalid type given. The value should be a string or a integer" => "不正な形式です。値は文字列または数値である必要があります",
    "'%value%' does not appear to be a postal code" => " '%value%' は郵便番号でないようです",

    返信削除