gettext は PHP で Web サイトをローカライズするための最良の方法ですか? 私はフレームワークを使用しておらず、翻訳する単語も多くなく、わずかに異なる 2 つのバージョンの英語のみです。
4 に答える
を使用しlang_XX.php
て、アプリケーションに含めることができます。
$lang = array(
"welcome" => "Welcome",
"bye" => "Bye"
);
他の言語の場合、たとえばlang_fr.php
、次のようなものがあります。
$lang = array(
"welcome" => "Accueil",
"bye" => "Au revoir"
);
小さなユースケースの場合、これは問題なく、.po
ファイルを使用する必要はありません。また、次のように定義できます。
function _($l)
{
return $lang[$l];
}
gettext が最良の方法です。文字列が少なく、あまり成長しないと予想される小さなサイトの場合、既に投稿されているソリューションに似たものを実装する方が、gettext の使用方法を学んで構成するよりも実際には速いかもしれません。
tl;dr:
人々は何年にもわたって機能する翻訳システムを作成するために懸命に考えてきました。そのホイールを再発明するために何年も費やすか、gettext の使用方法を学ぶために少し時間を費やすことができます。
オープン ソースの世界では、gettext は実質的にデファクト スタンダードです。
gettext が翻訳配列の大きなリストを保持する通常の代替手段よりも優れている理由を次に示します。
- 速いです
- スレッドごとに 1 回、すべての文字列をメモリにロードする必要はありません。
- poedit など、翻訳者向けのツールが多数サポートされているため、PHP コードの編集方法を理解している翻訳者に依存する必要はありません。
- msgmerge などのツールをサポートしているため、作業中にファイルを送信して翻訳することができ、新しい翻訳可能なテキストを追加して簡単にマージすることができます。
- 文字列のコンテキストについて翻訳者にコメントする必要がありますか? gettext は、それが使用されているコードからコメントを取得し、それを翻訳ファイルにコピーします
- 翻訳キーは英語のテキストです。まだ翻訳されていない場合、テキストはまだ平易な英語で表示されます。これまでのこの回答で与えられた解決策はどれもこれを正しく行いません。
- 文字列が整数に依存する場合、複数形をサポートします。英語には 2 つの形式しかありません
if n != 1 "There was a person" else "There were n people"
。他の言語では、規則は (n!=1) ほど単純ではありません。ロシア語には 3 つの異なるバリエーションがあり、規則は次のとおりです。n%100/10==1 ? 2 : n%10==1 ? 0 : (n+9)%10>3 ? 2 : 1;
パフォーマンスの観点から、gettext
Extensionは、文字列 ID のようにローカライズされたテキストにマップする String-Array を使用するよりも高速です (たとえば、 some を"WelcomeText" => "Welcome to our homepage."
使用して含まれ <?= $strings["WelcomeText"] >
ます。PHP 拡張機能を使用できる場合、gettext の純粋な PHP 実装は遅く、お勧めできません。詳細詳細はこちらgettextを使用した PHP Web サイトのローカライズとPHP ローカリゼーションのベンチマーク – gettext は十分高速ですか?
決して/非常にめったに変更されない静的コンテンツの場合は、確かに。
動的コンテンツの場合、少しでもありません。.poファイルなどのコンパイルは非常に重要です。代わりに、キャッシュされたコンパイル済みテンプレートを使用して、ある種のJSONまたはXMLソリューションとテンプレートを作成することをお勧めします。