8

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
?>
4

4 に答える 4

13

gettext の良いところは、それが一種の事実上の標準であることです。多くのアプリケーションで、多くの言語で使用されています。つまり、多くの人が使用しています。

もう 1 つの良い点(結果、または原因、あるいはその両方)は、たとえばPoeditのような gettext ファイルを編集するためのいくつかのツールが存在することです。 . そして、これは非常に重要です:

  • これは、非技術者が gettext ローカリゼーション ファイルを編集できることを意味します。
    • たぶん、これはあなたにとって重要ではないと思われるかもしれませんが、
    • しかし、大規模なオープンソース アプリケーションに取り組んでいる場合、それが成功し、多くの人が自分の言語でそれを必要とするかどうかが重要になります。
  • これは、アプリケーションを壊すリスクがないことを意味します(たとえば、引用符の不一致による「解析エラー」を考えてみてください ;-) )
于 2009-09-12T17:32:12.527 に答える
6

あなたの「実装」にはいくつかの欠点があります。

  • gettextで実装されているのとは異なりphpます。;-)
  • 使用するかどうかに関係なく、翻訳全体がメモリに保持されます
  • さらに悪いことに、1行が必要になるたびにデータの配列全体をインスタンス化します(PHPでは時間がかかり、かなりのメモリが必要です)。
  • 多くの言語で複数形を処理できない
  • この翻訳を使用したコードはほとんど読めません
  • この翻訳を使用するコードには、翻訳がない場合に使用するフォールバックが組み込まれていません。

基本的に、あなたの実装は、国際化サポートと非常に革新的な車輪の発明を主張しようとしている多くのプロジェクトで広く使用されていますが、結果については少し気にせず、良いことも悪いことも知りません。

于 2009-09-12T17:39:02.887 に答える
4

次のようなすべての質問に対する同じ答えです。

[私のハッキーな生意気な初心者の実装] よりも [高度に証明され、広く使用されているソリューション] の方が優れているものは何ですか?

  • 信じられないかもしれませんが、経験豊富な開発者がそれに取り組み、使用し、賞賛した場合、それにはおそらく理由があります.
  • これは標準であるため、ソリューションがより優れていたとしても、それを破るために支払う代償は、それだけの価値がない場合があります。
  • あなたのアイデアは問題を解決することだけを目的としていますが、グローバルな範囲を念頭に置いて開発されているため、実装よりも 1000 以上のことができます。

私は批判しているわけではありません。私たちは皆、自分たちが頭が良く、他の人は行き過ぎのプログラマーだと自分自身に納得させようとして、そうしたのです。それは学習方法の一部です。私は実際にそれを継続的に行っており、車輪を再発明したり、ハッキングしたKISSコードについて友人や同僚に見せびらかしたりしています. 時間が経つにつれて、あなたはそれをますます少なくしてしまいます.そして、私はあなたが実際にそれをするに値する日にそれをやめると思います:-)

于 2009-09-12T17:51:12.760 に答える
1

gettextの利点は、Java文字列テーブルやWindowsリソースなどの他のソリューションと比較して、ソースコードが読みやすくなることです。

これを比較してください:

printf(_("No photo available (error %d)."), err);

これとともに:

printf(i18n(NO_PHOTO), err);
// or some variant of the same thing

最初のケースでは、コードのすぐそこにメッセージが表示され、メッセージの機能を正確に把握できます。後者の場合、シンボリック定数のみが表示され、正確なテキストとフォーマット指定子を検索する必要があります。

于 2009-12-29T16:58:00.833 に答える