0

私は、多くの言語で入力を受け入れる小さなパーサーに取り組んでいます。入力を解析する際にキーワード/アンカーとして機能するおそらく 50 個の文字列を用意する予定です。PHP では、これらの翻訳されたキーワードを整理する最良の方法は何でしょうか?

考えられる解決策の 1 つは、連想配列を使用することです。このような:

$lang = array('us' => array('totalDebt' => 'Total Debt', 'color' => 'Color'),
              'gb' => array('totalDebt' => 'Total Debt', 'color' => 'Colour'))

次に、次を使用してアクセスできます。

$langCode = 'en';
$debtPos = strpos($lang[$langCode]['totalDebt']);

多数の言語に翻訳された一連の短い文字列を処理するための、より優れた実績のある方法はありますか?

4

5 に答える 5

2

完全な翻訳ソリューションについては、 gettextのようなソリューションを参照できます。

あなたのソリューションは、小さな辞書には十分です(高速でリソースが安価です)。strpos() 関数を使用して何をしようとしているのか理解できませんでした。

翻訳したい用語がその言語に存在しない場合は、何らかのフォールバックを使用することを忘れないでください。通常、フォールバックは英語です。

于 2008-11-06T19:10:43.783 に答える
0

ローカリゼーションファイルを追加することで言語を追加できるため、一般的に人々はアプリケーションでl10n(または同様のもの)を使用します。これは、プログラマーがコードを変更する必要がないことを意味します。しかし、それが単純なスクリプトである場合、ローカリゼーションに完全に取り組むのはやり過ぎでしょう。

于 2008-11-06T18:58:21.733 に答える
0

ピーターが言ったように、あなたは正しい考えを持っていますが、あなたの言語を異なるファイルに分けてください。これは、PHPがすべての単一言語のすべての単語の配列を格納する必要がないことを意味します。一度にロードするのは1つの言語のみであるため、$lang['us']ネストのレベルもスキップできます。

言語を「拡張」することもできます。

<?php // lang.en-gb.php
$lang = array(
    'color' => "Colour",
    'totalDebt' => "Total Debt",
    ...
);
?>

<?php // lang.en-us.php
include('lang.en-gb.php');

$lang['color'] = "Color";
// don't need to redefine "totalDebt"
?>

ロケールを検出し、正しいファイルを選択し、用語が特定の言語で定義されていない場合は「エラー」処理を行うなど、これらすべてを処理する基本クラスを作成することを検討することもできます。

于 2008-11-07T00:32:32.323 に答える
0

私はあなたのソリューションが他のOSプロジェクトで使用されているのを見ましたが、$langアレイは通常異なるファイルで構築されています。例えば:

<?php // lang.us.php
$LANG['us'] = array(
                    'totalDebt' => 'Total Debt',
                    'color' => 'Color',
                   );

lang.gb.php、lang.de.phpなどの場合も同様です。

于 2008-11-07T00:05:15.640 に答える
0

'totaldebt' => 'Total Debt' は、最終的にコードを難読化し、単に 'Total Debt' をハッシュ キーとして格納するよりも遅くなるため、おそらく必要ありません。gettext のやり方は、文字列を関数でラップするだけです。

そうではなく:

echo "Color";

あなたがやる:

echo t("Color");

t() 関数は、グローバルに定義された言語を調べ、可能であれば置換を行います。ある時点で、gettext を使用したい場合があり、この方法は互換性があります。

于 2008-11-07T01:15:25.263 に答える