My_Translate

My_TranslateはZend_Translateの拡張コンポーネントクラスです。ブラウザの言語設定に応じて動的に表示する言語を切り替えを行うようになっています。コントローラやビューファイル中で呼び出す他、エラーメッセージ等もここから呼び出します。Zend_Translateのリファレンスは下記ページをご覧下さい。

http://framework.zend.com/manual/ja/zend.translate.html

基本的な使用方法

My_Translateのmessage下にあるiniファイルを全て読み込み、Zend_Translateへとセットします。ファイルについて詳しくはmessageについての項目をご覧下さい。

  • application
    • messages
      • en
        • html_header
          • meta_description.ini
          • meta_description.ini
          • title.ini
        • code.ini
        • fields.ini
        • js.ini
        • lang.ini
      • ja
        • html_header
          • meta_description.ini
          • meta_description.ini
          • title.ini
        • code.ini
        • fields.ini
        • js.ini
        • lang.ini

ファイルを読み込んだ後に使用する言語を設定します。My_TranslateはBootstrap中で初期化や言語設定を行っています。翻訳を使用したい時はインスタンスの呼び出しや設定を行う必要はなく、すぐにメソッドを記述できます。

メッセージファイル中には次のように記述します。

Message1 = "表示したいメッセージ1"
Message2 = "表示したいメッセージ2"
...

コントローラ中で使用する場合、次のように書きます。

// 「メッセージ1」が返される
$message = $this->_translate->_('Message1');

コントローラ以外のコンポーネントで使用する場合、次のようにZend_Registryから呼び出し可能です。

// 「メッセージ1」が返される
$translate = Zend_Registry::get('Translate');
$message = $translate ->_('Message1');

また、同じトランスレータをビューに$tとしてアサインしています。ビューで翻訳を使用する場合は次のように記述します。

<{* 「メッセージ1」が返される *}>
<{$t->_('Message1')}>

 

利用可能なアダプタについて

このドキュメント中ではアダプタとしてIniを使用していますが、Zend_Translateで使用可能な他のアダプタも使用可能となっています。params.ini中のtranslate_adapterを修正する事によりアダプタを変更可能です。利用可能なアダプタの詳細は下記ページをご覧下さい。

http://framework.zend.com/manual/ja/zend.translate.adapter.html

また、読み込むのは各アダプタに対応する拡張子のファイルのみとなります。アダプタを変更する場合はファイル名や拡張子を変更の上、そのアダプタのフォーマットに沿ったソースファイルの作成をお願いします。

 

自動的な言語切り替え機能について

translate_enableを1としている場合、アクセスしてきたブラウザの言語設定を確認し、次のルールに基づいて使用する言語を決定します。

  • ブラウザの言語設定で優先度の高い順に、同じ言語がMy_Translateに登録されているか確認する。
  • 言語が登録されていればそれを使用する。登録されていなければ次の優先度の言語について確認を行う。
  • ブラウザの言語設定中に見つからなかった場合、params.iniのmessage_langを言語として使用します。

言語の切り替えを行わない時はparams.ini内のtranslate_enableを0にします。このように設定する事でブラウザの設定によらず常にmessage_langの言語を使用するようにします。

 

ファイルキャッシュについて

My_Translateでは処理軽減のためソースファイルを読み込んだ後のオブジェクトのキャッシュを生成するようになっています。開発時にはキャッシュファイルについて留意をお願いします。キャッシュについてはCacheについてをご覧下さい。

 

特別な意味を持つmessageIdについて

特定のmessageIdはZF-Exのシステム上で使用します。該当する機能の メッセージを拡張する場合は同様の規則に従って記述するようにお願いします。

バリデーションのメッセージ

バリデーションのメッセージはcode.iniにValidate.(バリデーション).(エラーコード)というフォーマットで書かれています。これはこのままMy_Validateで読み込まれます。

Validate.NotEmpty.IS_EMPTY = "%sが空欄です"
Validate.Int.NOT_INT = "%sが整数でありません"
...

システムコードのメッセージ

システムコードのメッセージはcode.iniにCode.(コード)というフォーマットで書かれています。

Code.DATA_NOT_FOUND = "データが見つかりません"
Code.ADD_COMPLETE = "%sの新規追加を実行しました";
...

このメッセージを読み込むには、コントローラのメソッドAppController::getCodeMessage($code)を使用します。

このメソッドの引数$codeに入力する値は、元のメッセージに差し込み項目があるかどうかによって変わります。差し込み項目がない場合にはそのままstringでコードを入れます。差し込み項目がある場合にはarrayを入力し、配列の第二項目以降を差し込み用のメッセージとして扱います。例えば上のコードメッセージの例ではコントローラ中に次のように入力する事で値を取得します。

$msg_1 = $this->getCodeMessage('DATA_NOT_FOUND');

$msg_2 = $this->getCodeMessage(array('ADD_COMPLETE', '商品'));

 

モデルのフィールドのメッセージ

モデルのフィールドはfields.iniに(モデル名).field.(フィールド名)というフォーマットで書かれています。モデルのインスタンスを生成する際、コンストラクタ中でフィールドの名前を取得するようになっています。

products.field.id = "ID"
products.field.category_id = "カテゴリ名"
products.field.name = "商品名"
...

モデルのリストのメッセージ

モデルのリストはfields.iniに(モデル名).const.(定数名)というフォーマットで書かれています。

products.const.IS_PUBLIC = "公開"
products.const.IS_NOT_PUBLIC = "非公開"
...

モデル中で次のように書く事で一覧のリストを生成します。

protected $_public_list = array();
const IS_NOT_PUBLIC = '0';
const IS_PUBLIC = '1';

/**
 * コンストラクタ
 */
public function __construct(){
    parent::__construct();

    $list = new Zend_Config_Ini(MESSAGE_PATH . '/model_list.ini', 'products');
    $list = $list->toArray();
    $this->_public_list = $this->makeConstList(array('IS_NOT_PUBLIC', 'IS_PUBLIC'));
    // バリデーション条件の設定
    $this->addEnumList('public_flg', array_keys($this->_public_list));
}