質問
SOのどこでも、PHPで多言語アプリを作成する場合、誰もが gettextと言うが最善の方法です。なぜ知りたいのですか?
このメソッドを以下のようにしますが、gettextを使用するよりも効率が低下しますか?
<?PHP
//Have seperate language files for each language I add, this would be english file
function lang($phrase){
static $lang = array(
'NO_PHOTO' => 'No photo\'s available',
'NEW_MEMBER' => 'This user is new'
);
return $lang[$phrase];
}
//Then in application where there is text from the site and not from users I would do something like this
echo lang('NO_PHOTO'); // No photo's available would show here
?>
解決
gettextの良い点は、それが一種の事実上の標準であるということです。多くの言語で多くのアプリケーションで使用されています。
別の良いこと(実際には結果、原因、またはその両方)は、 Poedit は、たとえばgettextファイルを編集するために存在します。PHP(またはその他)のソースコードを使用する必要はありません。これは非常に重要です:
- これは、非技術者でもgettextローカライズファイルを編集できることを意味します
- これは今、あなたにとって重要ではないようです
- しかし、大きなオープンソースアプリケーションで作業している場合、それが成功し、多くの人が自分の言語でそれを必要とする場合、それは重要になります。
- これは、アプリケーションを壊すリスクがないことを意味します(たとえば、引用符の不一致が原因で&quot; parse error&quot; ;-))
他のヒント
「実装」にはいくつかの欠点があります。
-
gettext
とは異なり、php
で実装されています。 ;-) - 使用するかどうかに関係なく、翻訳全体をメモリに保持します
- さらに悪いことに、1行が必要なときはいつでもデータの配列全体をインスタンス化します(PHPではしばらく時間がかかり、かなりのメモリが必要です)
- 多くの言語で複数形を処理することはできません
- この翻訳を使用したコードはほとんど読めません
- この翻訳を使用するコードには、翻訳がない場合に使用する埋め込みフォールバックがありません。
基本的に、あなたの実装は、国際化サポートと車輪の非常に革新的な発明を主張したい多くのプロジェクトで広く使用されていますが、結果については少し気にせず、悪いものから良いものを知りません。
次のように見えるすべての質問に対して同じ答えがあります:
[非常に証明された点で優れている点 広く使用されているソリューション] [私のハッキーな生意気なヌーブよりも 実装]?
- 長い間ここにいましたが、信じられないかもしれませんが、経験豊富な開発者がそれに取り組み、使い、賞賛したなら、おそらく理由があります。
- これは標準であるため、ソリューションが改善されたとしても、それを壊すために支払う代価は価値がない場合があります。
- あなたのアイデアはあなたの問題を解決することだけを目的としているのに対し、グローバルスコープを念頭に置いて開発されているため、実装よりも1000以上多くのことができます。
私は批判していません。私たち全員がそうしました。私たちは自分たちがスマーティーズであり、他の人たちは過剰なプログラマーだと確信させようとしました。それは学ぶ方法の一部です。私は実際にそれを継続的に行い、車輪を再発明したり、ハッキングしたKISSコードについて友人や同僚に見せたりしました。時間が経つにつれて、あなたはそれを次第に少なくしていくことになります。そして、実際にそれを行うに値する日にあなたはそれをやめると思います:-)
gettextの利点は、他のソリューション(Java文字列テーブル、Windowsリソースなど)と比較して、ソースコードが読みやすくなることです。
これを比較:
printf(_("No photo available (error %d)."), err);
これ:
printf(i18n(NO_PHOTO), err);
// or some variant of the same thing
最初のケースでは、コード内のメッセージをすぐに見ることができ、それが何をするかを正確に知っています。後者の場合、シンボリック定数のみが表示され、正確なテキストと書式指定子を検索する必要があります。