Gettext は変換が容易なため優れていますが、デフォルトの PHP 実装はスレッド セーフではありません。したがって、Yii は独自のアンパッカーを使用するため、php 配列と比較して処理時間が大幅に増加します。
大量のトランザクションが発生するサイトをセットアップしていたため、パフォーマンスへの影響は許容できませんでした。また、APC を使用することで、PHP の翻訳をキャッシュしてパフォーマンスをさらに向上させることができます。
したがって、私のアプローチは PHP 配列を使用することでしたが、翻訳を容易にするために翻訳を DB に保持し、翻訳が変更されたときに必要なファイルを生成します。
DB は次のようになります。
TABLE Message // stores source language, updated by script
id INT UNSIGNED
category VARCHAR(20) // first argument to Yii::t()
key TEXT // second argument to Yii::t()
occurences TINYINT UNSIGNED // number of times found in sources
TABLE MessageTranslation // stores target language, translated by human
id INT UNSIGNED
language VARCHAR(3) // ISO 639-1 or 639-3, as used by Yii
messageId INT UNSIGNED // foreign key on Message table
value TEXT
version VARCHAR(15)
creationTime TIMESTAMP DEFAULT NOW()
lastModifiedTime TIMESTAMP DEFAULT NULL
lastModifiedUserId INT UNSIGNED
次に、CLI ツールの yiic 'message' コマンドを変更して、収集した文字列を DB にダンプしました。
http://www.yiiframework.com/wiki/41/how-to-extend-yiic-shell-commands/
DB に入ると、単純な CMS をセットアップして、翻訳者に簡単な翻訳方法を提供すると同時に、バージョン情報を提供したり、古いバージョンに戻したり、翻訳者の品質をチェックしたりできます...
これも yiic から変更された別のスクリプトが、DB 情報を取得して PHP 配列にコンパイルします。基本的に、各言語の 2 つのテーブルを JOIN し、'Message'.'key' と 'MessageTranslation'.'value' をキー => 値として使用して配列を作成し、' という名前のファイルに保存します。言語で指定されたフォルダ内のメッセージ'.'カテゴリ'。
生成されたファイルは、通常どおり Yii CPhpMessageSource によってロードされます。
画像の場合、これは適切な言語のフォルダーに配置し、リンク時にアプリの言語を取得するのと同じくらい簡単でした。
<img src="/images/<?php echo Yii::app()->language; ?>/help_button.png">
実際には、言語文字列から国を取り除くための小さなヘルパー メソッドを作成したことに注意してください。「en_us」は「en」である必要があります。