28

新しい質問を作成する代わりに更新された質問...

私が構築しているソーシャル ネットワーク サイトで、英語以外の代替言語をいくつか提供したいと思っています。言語の翻訳を行うのはこれが初めてなので、ご容赦ください。
私は研究しているので、私は耳を傾け、アイデアにオープンであり、すでにここにたくさんの質問があります.

1)
i18n とはどういう意味ですか? SO で言語翻訳を調べているときによく見かけます。

2)
ほとんどの人はgettextを使用するPHP には拡張機能またはサポートがある
と言っていますが、私はそれを研究しており、基本的な理解はしています
。サイトの機能を使用するようにサイトをコーディングすることを意味します。 _('hello world i'm in English for now')またはgettext('hello world i'm in English for now')は問題ありません。
しかし、その後、サーバーに gettext をインストールして動作させる必要があり、
それから特別なエディターを使用して特別なファイルを作成し、それらをコンパイルする必要があると思います。

面倒くさいように聞こえますが、これが最善の方法であることは理解していますが、誰もがそう言っているようです。
では、なぜこれが進むべき道なのか誰か教えてもらえますか?

3)
このアプローチのシンプルさがとても気に入っています。言語配列を構築し、以下の例のように関数で必要なフレーズを呼び出すだけです。その後、適切な言語配列を含むファイルを含めるだけです。

私が本当に知りたいのは、これは 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
?>

*以下のbrianreavisの回答から使用されたいくつかのコード

4

9 に答える 9

24

言語マッピングを処理する関数を定義するのがおそらく最善でしょう。そうすれば、後で動作を変更たい場合でも、使用したスクリプトを何百ものスクリプトから探し出し$lang[...]て別のものに置き換える必要はありません。

このようなものが機能し、素晴らしく高速になります。

function lang($phrase){
    static $lang = array(
        'NO_PHOTO' => 'No photo\'s available',
        'NEW_MEMBER' => 'This user is new'
    );
    return $lang[$phrase];
}

関数が呼び出されるたびに再割り当てされないように、配列が関数内で宣言されていることを確認してください。これは、が非常に大きいstatic場合に特に重要です。$lang

使用するには:

echo lang('NO_PHOTO');

複数の言語を処理するには、この関数を複数のファイル ( 、 など) で定義しen.phpfr.phpユーザーrequire()に適切なファイルを定義するだけです。

于 2009-09-12T03:07:13.143 に答える
11

これはうまくいくかもしれません:

function _L($phrase){
static $_L = array(
    'NO_PHOTO' => 'No photo\'s available',
    'NEW_MEMBER' => 'This user is new'
);

     return (!array_key_exists($phrase,$_L)) ? $phrase : $_L[$phrase];
}

それは私が今のところ使っているものです。言語が見つからない場合は、エラーではなくフレーズが返されます。

配列には最大 65500 個の項目を含めることができることに注意してください。十分なはずですが、まあ、言うだけです。

ユーザーの言語を確認するために使用するコードを次に示します。

<?php
function setSessionLanguageToDefault() {
    $ip=$_SERVER['REMOTE_ADDR'];
    $url='http://api.hostip.info/get_html.php?ip='.$ip;
    $data=file_get_contents($url);
    $s=explode (':',$data);
    $s2=explode('(',$s[1]);

    $country=str_replace(')','',substr($s2[1], 0, 3));

    if ($country=='us') {
        $country='en';
    }

    $country=strtolower(ereg_replace("[^A-Za-z0-9]", "", $country ));
    $_SESSION["_LANGUAGE"]=$country;
}

if (!isset($_SESSION["_LANGUAGE"])) {
    setSessionLanguageToDefault();
}

if (file_exists(APP_DIR.'/language/'.$_SESSION["_LANGUAGE"].'.php')) {
    include(APP_DIR.'/language/'.$_SESSION["_LANGUAGE"].'.php');
} else {
    include(APP_DIR.'/language/'.DEFAULT_LANG.'.php');
}

?>

まだ完了していませんが、これは大いに役立つと思います。

于 2012-03-24T17:48:51.930 に答える
7

独自の言語フレームワークを作成しないでください。gettextを使用します。PHPには、インストールできる標準のバインディングがあります。

于 2009-09-12T03:02:39.350 に答える
4

車輪を再発明しないでください。たとえば、gettextまたはZend_Translateを使用します。

于 2009-09-12T03:17:15.230 に答える
2

他の回答は実際にはすべての質問に回答しているわけではないので、回答に加えて賢明な代替案を提供します。

1) I18n は Internationalization の略で、I-eighteen-n といくつかの類似点があります。

2) 私の正直な意見では、gettext は時間の無駄です。

3) あなたのアプローチは良さそうです。探すべきは言語変数です。WoltLab Community Framework 2.0は双方向言語システムを実装しています。データベースに保存される言語変数があり、テンプレート内では変数の名前のみが使用され、現在の言語の変数の内容に置き換えられます (利用可能な場合)。システムの 2 番目の部分は、ユーザーが生成したコンテンツを複数の言語で保存する方法を提供します (複数の言語での入力が必要です)。

基本的に、開発者によって定義されたインターフェース テキストと、ユーザーによって定義されたコンテンツがあります。コンテンツの多言語テキストは言語変数に保存され、言語変数の名前は特定のコンテンツ テーブルのテキスト フィールドの値として使用されます (単一言語のコンテンツも可能であるため)。

残念なことに、WCF の構造は、フレームワークの外でコードを再利用するのが非常に難しいという点にありますが、インスピレーションとして利用することはできます。システムの範囲は、サイトで何を達成したいかだけに依存します。それよりも大きくなる場合は、間違いなく WCF システムを確認する必要があります。小さい場合は、現在の言語の正しいファイルが含まれているいくつかの専用言語ファイル (de.php、en.php など) で十分です。

于 2014-01-12T18:20:03.380 に答える
1

多次元配列として作成してみませんか...このように

<?php

$lang = array(
    'EN'=> array(
        'NO_PHOTO'=>'No photo\'s avaiable',
        'NEW_MEMBER'=>'This user is new',
    ),
    'MY'=> array(
        'NO_PHOTO'=>'Tiada gambar',
        'NEW_MEMBER'=>'Ini adalah pengguna baru',
    )
);

?>
于 2009-09-12T03:04:08.443 に答える
0

残念ながら、gettextはうまく機能せず、さまざまな OS (Windows または Linux) などのさまざまな状況で問題が発生し、機能させるのは非常に困難です。

さらに、多くの環境変数とドメインを設定する必要がありますが、これは意味がありません。

開発者が単にテキストの翻訳を取得したい場合は、.mo ファイル パスのみを設定し、translate("hello","en_EN"); のような 1 つの関数で翻訳を取得する必要があります。gettext では、これは不可能です。

于 2017-10-02T15:10:09.983 に答える