23

Yii は素晴らしいフレームワークだと思います。yiic シェルで作成されたサンプル Web サイトは、出発点としては適切ですが、残念ながら、多言語 Web サイトのトピックはカバーされていません。ドキュメントは短いメッセージを翻訳するトピックをカバーしていますが、多言語コンテンツを保持していません...

少なくとも 2 つの言語を使用する必要がある Web サイトの作業を開始しようとしています。そのためのコンテンツを維持するための最良の方法を考えています...問題は、コンテンツが共通の要素と広範囲に混在していることです。 (埋め込まれたビデオ ファイルなど)。

これらのコモンの重複を避ける必要があります...これまで、テキストを含む配列の配列(通常は1〜2個の短い段落)を使用していましたが、ビューファイルは配列からテキストをレンダリングするだけでした。

ここで、配列に保持することを避けたいと思います (二重引用符 " " を配置するときに注意が必要であり、一般的に不便です...)。

では、これらの短い段落を維持するための最良の方法は何ですか? それらを (id | msg_id | language | content ) のように DB に保持し、msg_id & language で選択する必要がありますか? それでも、いくつかの msg_id を作成してビュー ファイルに埋め込む必要があります ...

Yii にいくつかの解決策がある推奨パラダイムはありますか?

ありがとう、M.

4

4 に答える 4

19

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」である必要があります。

于 2010-11-08T21:22:49.910 に答える
17

デフォルトでは、Yii アプリケーションはテキスト メッセージの翻訳に yii::t() メソッドを使用し、メッセージ ソースには 3 つの異なるタイプがあります。

  1. CPhpMessageSource : 翻訳はキーと値のペアとして PHP 配列に格納されます。
  2. CGettextMessageSource : 翻訳は GNU Gettext ファイルとして保存されます。(PO ファイル)
  3. CDbMessageSource : メッセージの翻訳はデータベース テーブルに格納されます。

誤解していなければ、翻訳に従来の配列を使用しています。翻訳操作には Yii で GetText と PO ファイルを使用することをお勧めします。

翻訳と yii を使った i18n に関する多くの情報は、この公式ドキュメント ページにあります。

于 2010-03-25T17:13:50.710 に答える
1

ここで問題となるのは、ページ上の静的テキスト/メッセージを翻訳する方法であり、Yii は Yii:t() を使用してかなりうまく解決しており、Edigu の答えはそれに対するものです。

データベース内の動的コンテンツの翻訳に関する FlexicaCMS の投稿を確認しました。最終的には、静的テキスト/メッセージの問題を解決した後の次の記事になります。これは、Yii の動作を使用した本当に優れたアプローチです。FlexicaCMS の作成者がそのような方法で翻訳をサポートすることに野心的すぎるかどうかはわかりません。コンテンツの翻訳が心配のないものになるためです。

彼らが言及していないことの1つは、翻訳されたページのURLです. たとえば、your.site.com/fr/translated_article_title.html です。SEO に役立つように、URL には /language_id/ の部分が含まれている必要があります。

于 2010-06-15T03:27:25.200 に答える
0

Yii1 と Yii2 では、yii\i18n\GettextMessageSource はとにかく Yii の完全なキャッシュ エンジンを使用して (ソースを見てください)、PO または MO ファイルの負荷を高めます。これらのファイルを php 純粋なコード (yii\i18n\GettextMessageSource を含む) を使用してロードすることはお勧めしません (php 配列 idx よりも遅いです): http://mel.melaxis.com/devblog/2006/04/10/benchmarking- php-localization-is-gettext-fast-enough/

ただし、MO ファイルの php gettext ext は、キャッシュを使用するため、変換 php 配列よりも少し高速ですが、MO のすべての変更にはサーバーの再起動が必要です。

最善の解決策は、独自のコード ライブラリで yii\i18n\GettextMessageSource を拡張し、キャッシュ機能を GettextMessageSource に追加してパフォーマンスを向上させ、拡張バージョンをコンポーネントとして使用することだと思います。

protected function loadMessages($category, $language);

ロードごとに MO の変更日をチェックしてキャッシュと比較しないでください。代わりに、MO または PO ファイルが変更されたときにキャッシュをクリアします (スケジュールの可能性があります)。

于 2016-09-05T08:37:51.223 に答える