イーイ:多言語 Web サイト - ベスト プラクティス
-
21-09-2019 - |
質問
Yii は素晴らしいフレームワークだと思います。yiic シェルで作成されたサンプル Web サイトは開始点として最適です。ただし、残念ながら、多言語 Web サイトに関するトピックはカバーされていません。このドキュメントでは、ショート メッセージの翻訳について説明していますが、多言語コンテンツの保持については説明していません。
少なくとも 2 つの言語で説明する必要がある Web サイトの制作を始めようとしているのですが、そのコンテンツを保持する最善の方法は何だろうと考えています...問題は、コンテンツに一般的な要素 (埋め込みビデオ ファイルなど) が広範囲に混在していることです。
これらのコモンズの重複を避ける必要があります...これまでは、テキスト (通常は 1 ~ 2 つの短い段落まで) を含む配列の配列を使用していましたが、ビュー ファイルは配列からテキストをレンダリングするだけでした。
ここで、それを配列に保持することは避けたいと思います(二重引用符 " " を入れるときに注意が必要で、一般的に不便です...)。
では、これらの短い段落を保持するための最良の方法は何でしょうか?(id | msg_id | language | content ) のように DB に保持し、msg_id と言語で選択する必要がありますか?そのためには、いくつかの msg_id を作成してビュー ファイルに埋め込む必要があります...
Yii が解決策を提供する推奨パラダイムはありますか?
ありがとう、m。
解決
Yii アプリケーションはデフォルトで yii::t() メソッドを使用してテキストメッセージを翻訳し、メッセージソースには 3 つの異なるタイプがあります。
- CPhpメッセージソース :翻訳はキーと値のペアとして PHP 配列に保存されます。
- CGettextMessageSource :翻訳は GNU Gettext ファイルとして保存されます。(PO ファイル)
- CDbメッセージソース :メッセージの翻訳はデータベース テーブルに保存されます。
誤解がなければ、翻訳には古典的な配列を使用しています。翻訳操作には Yii で GetText ファイルと PO ファイルを使用することをお勧めします。
ここでは、yii を使用した翻訳と i18n に関する多くの情報を見つけることができます。 公式ドキュメントページ.
他のヒント
の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
私は、DBに収集した文字列をダンプするCLIツールyiic「メッセージ」コマンドを変更します。
http://www.yiiframework.com /ウィキ/ 41 /どのように対に延び-yiicシェル・コマンド/ の
DBで、シンプルなCMSは、翻訳者に翻訳する簡単な方法を提供するように設定することができ、同時に、バージョン情報を提供する旧バージョンに戻す、翻訳の品質を確認した後など...
またyiicから変更別のスクリプトは、その後、DB情報を取得し、PHP配列にコンパイル。基本的には「メッセージ」。「キー」と「MessageTranslation」を使用してアレイを構築し、その後、各言語用の2つの表の結合。(他に何?)キー=>値として「価値」...からという名前のファイルに保存します "メッセージ」。 『言語で指定したフォルダ内のカテゴリ』ます。
生成されたファイルは、YiiのCPhpMessageSourceにより、通常のようにロードされます。
イメージの場合、これは適切な言語でのフォルダに置くと連携アプリの言語を取得するような単純なようだった。
<img src="/images/<?php echo Yii::app()->language; ?>/help_button.png">
は実際の生活の中で、私は言語文字列から国を取り除くために少しヘルパーメソッドを書いた。なお、「en_USのは、」「en」とする必要があります。
さて、私、ここで懸念されているものだと思うが、ページ上の静的なテキスト/メッセージを翻訳する方法で、YiiはYiiのを使用してかなりよく、それを解決します。t()とエディゲの答えはそれのためである。
。私はあなたが静的なテキスト/メッセージの問題を解決し、それはYiiのの行動を使用して、本当に良いアプローチです後に次になることも最終的には、データベース内の動的コンテンツを翻訳についてFlexicaCMS上のポストをチェックしてください。わからないFlexicaCMSの作成者が翻訳を支援する上であまりにも野心的であれば、それがコンテンツ翻訳安心なものになるだろうとして道 - 。本当に素晴らしい。
彼らは言及していない一つは、翻訳されたページのURLです。例your.site.com/fr/translated_article_title.htmlため。私はそれがSEOを支援することができますので、URL必見はそれに/ LANGUAGE_ID /部分を持っているわけます。
でYii1とYii2のYii \ i18nの\ GettextMessageSourceは、POやMOのファイルの負荷を高めるために、とにかく(ソースを見て)Yiiの完璧なキャッシュエンジンを使用していません。 (それがとても遅くPHPの配列IDXよりもだ)(Yiiの\ i18nの\ GettextMessageSource含む)、PHP、純粋なコードを使用して、これらのファイルをロードするためにお勧めしません。 ます。http://メル。 melaxis.com/devblog/2006/04/10/benchmarking-php-localization-is-gettext-fast-enough/する
それはキャッシュが使用していますが、マイナスポイントがあるため、しかし、PHPのgettext内線MOファイルのためには、いくつかのより高速な翻訳PHPの配列より:MO内のすべての変更は、サーバーの再起動が必要です。
私は最善の解決策は、独自のコードライブラリでのYii \ I18N \ GettextMessageSourceを拡張し、その性能を向上させ、部品として、あなたの拡張バージョンを使用するようにGettextMessageSourceにキャッシュ機能を追加することだと思います。
protected function loadMessages($category, $language);
だけがMOをチェックしていないが、MOやPOファイルが変更されたときの代わりに(それがスケジュールすることができます)のキャッシュをクリアし、キャッシュと比較するために、すべての負荷で日付を変更します。