Your browser (Internet Explorer 6) is out of date. It has known security flaws and may not display all features of this and other websites. Learn how to update your browser.
X
Post

[タスク] Zend_Translateを元に多言語対応

ver 0.1.0の修正箇所。メッセージファイル回りについて中規模な調整です。



今度のバージョンから、Bootstrap内で
Zend_Translateを元にしたインスタンスを生成するようになりました。
このインスタンスを元に翻訳が可能になっています。
また、自動的に言語判定を行い、
ブラウザの言語設定に合わせてメッセージの言語が切り換えられるようになってます。

また、多言語に対応しない場合は
自動判定を行わないようにすれば常に単一の言語が使用されます。
詳しくはMy_Translateの項目をご覧下さい。


今回既存のメッセージ表示ロジックをトランスレータに統合したため、
若干ファイル構造が変化しています。



元々のファイル構造はこのようになっており、



これをこのように変更しました。


ここにあったiniファイルは個別の処理ごとに読み込まれていましたが、
html_header配下以外はトランスレータでまとめて処理をするようにしました。

このディレクトリの全てのファイルをまとめてトランスレータで読み込んでいるため、
この通りのファイル名に従う必要はありません。
ファイル名とそのファイルに対応したメッセージの種別は一例であり、
必要に応じて追加したり変更してもらってもかまいません。


既存でメッセージを記述していたファイルについては、
取得方法や命名規則が変更されているためそれについてここで説明します。


lang.ini


汎用的なメッセージを登録する事を想定しています。
今回のバージョンで新規追加したファイルです。

ここに書かれているメッセージはビューファイルでのみ使用し、
他にシステム上で使わない事を想定しています。


code.ini


入力完了メッセージ、エラーメッセージ、バリデーションメッセージなど、
システム上の通知メッセージを管理するファイルです。

元々は各種システムメッセージを取得するため、個別にメッセージを読み込んでいました。


前のバージョンでは成功メッセージは
コントローラ中で次のように取得していました。

// 成功のメッセージをセット
// 成功メッセージはメンバ変数$_success_codeで管理していた。
$msg = $this->_helper->flashMessenger->getMessages();
if(!empty($msg)){
    $this->view->success_message = $this->_success_code[$msg[0]];
}

また、エラーメッセージはErrorController内で次のように取得していました。

// エラーメッセージをセット
// メンバ変数$error_msgで管理していた。
$code = $errors->exception->getMessage();
if(!empty($this->error_msg->$code)){
    $msg = $this->error_msg->$code;
}
else{
    $msg = $code;
}

これのメッセージ管理を統合し、コントローラ中で
次のように書く事でメッセージが取得できるようになりました。

// これにより、メンバ変数$_success_code, $error_msgともに廃止

// 成功メッセージの取得
$msg = $this->_helper->flashMessenger->getMessages();
if(!empty($msg)){
    $this->view->success_message = $this->getCodeMessage($msg[0]);
}

// エラーメッセージの取得
$code = $errors->exception->getMessage();
$msg = $this->getCodeMessage($code);

また、システムコードのプレフィックスとしてCode.が必要になりました。

; 元々はこのように書いていた
DATA_NOT_FOUND = "データが見つかりません"
ADD_COMPLETE = "新規追加を実行しました";

; これのプレフィックスとしてCode.と入れる事でコードメッセージと認識する
Code.DATA_NOT_FOUND = "データが見つかりません"
Code.ADD_COMPLETE = "新規追加を実行しました";


validateはバリデーションエラー時のメッセージで、My_Validateで使用していました。
My_Validateのコンポーネント内で処理が完結しているため、
コントローラやモデル中でこのメッセージを直接呼び出す機会はないかと思います。

ただし、プレフィックスにValidate.が必要となりました。


; 元々は「(バリデーションの種類).(エラーコード)」のフォーマットだった
NotEmpty.IS_EMPTY = "%sが空欄です"
Int.NOT_INT = "%sが整数でありません"

; これにプレフィックスとして「Validate.」の追加が必要となる
Validate.NotEmpty.IS_EMPTY = "%sが空欄です"
Validate.Int.NOT_INT = "%sが整数でありません"


fields.ini


DBテーブルのフィールド名を管理するファイルです。
ビューに$fields変数をアサインしていましたが、
トランスレータ経由となったためアサインされなくなりました。

また、フォーマットも
「(モデル名).(フィールド名)」から「(モデル名).field.(フィールド名)」に変更され、
途中にfieldがつくようになりました。

そのため、ビューファイルでフィールド名を表示する時の
表示方法も次のように変更されています。

<{* 以前のバージョンではこのようにしてフィールド名を表示していた *}>
<{$fields.product.name|escape}>
<{* 今度のバージョンではこのようにフィールド名を表示する *}>
<{$t->_('products.field.name')|escape}>

models_list.ini


DBテーブルのうち、特定のステータスを示す項目(商品の状態、公開/非公開など)
の項目リストを管理するファイルです。

fields.iniへと統合したため、
これらのメッセージ情報はfields.iniに含まれています。

また、フォーマットも
「(モデル名).(定数名)」から「(モデル名).const.(定数名)」に変更されました。

リストの設定はモデルクラス中で行い、
記述方法も次のように変更されています。

// 元々はこのような記法で書いていた
$list = new Zend_Config_Ini(MESSAGE_PATH . '/model_list.ini', 'list');
$list = $list->toArray();
$list = $list['products'];

$this->_public_list = array(self::IS_NOT_PUBLIC => $list['IS_NOT_PUBLIC'], self::IS_PUBLIC => $list['IS_PUBLIC']);

// このように変更
$this->_public_list = $this->makeConstList(array('IS_NOT_PUBLIC', 'IS_PUBLIC'));

; 元々はiniファイル中でこのように書いていた
products.IS_PUBLIC

; constを間に入れる
products.const.IS_PUBLIC


meta_description.ini, meta_keyword.ini, title.ini


これらのファイルはhtmlのヘッダ部分についての出力を制御するファイルです。
ディレクトリの位置が変わっただけで、記法などに変更はありません。
Zend_Translateに登録も行わないため、トランスレータでの翻訳もできません。

詳しくはMy_Html_Headerの項目をご覧下さい。

TrackBack URL :

Leave a comment  

name

email

website

Submit comment