12

Web プロジェクト (PHP 5) で翻訳を処理するために gettext の使用を開始したいと考えています。評判が良く広く使われている規格なので、ベストチョイスのようです。

ただし、サーバーに互換性がなく、スレッドセーフではないということも聞いています。それを使用する私のプロジェクトにとって、これはどういう意味ですか? 私は多くの人が使用するものを構築しているので、私のコードが機能することは非常に重要です。

マイナーな問題 (まだ PHP 4 を使用している人々など) について話しているのでしょうか、それとも web サーバーへの gettext の配布とインストールが少ないなどの大きな問題について話しているのでしょうか?

4

3 に答える 3

16

スレッドの問題は、組み込み PHP (Apache の mod-php など) を使用し、スレッドを使用するサーバー (worker-mpm を使用する Apache サーバーなど) を実行する場合にのみ適用されます。

したがって、次の場合、スレッドセーフの問題は当てはまりません。

  1. NGINXサーバーを使用します(スレッドは使用しません。)
  2. Apache (スレッド化された MPM を使用するかどうかに関係なく) と PHP を fastcgi モードで使用する
  3. 非スレッド MPM (prefork-MPM として) および mod-php モードの PHP で Apache を使用します。

したがって、デフォルトの Apache インストールを使用しているほとんどの人は、gettext がスレッド セーフではないことを心配する必要はありません。ほとんどのディストリビューションのデフォルトの Apache のインストールでは、スレッド化されていない prefork-MPM が使用されているからです。

PS また、Windows 上の Apache はスレッド化されていることに注意してください。

于 2011-07-17T20:27:15.507 に答える
2

PHPのマニュアルコメントの部分でもう少し遊んでみると、より多くの情報が復活するはずです....gettextセクションのマニュアルからのコメントの1つ

GNU gettextライブラリは、スレッドごとではなく、プロセスごとに機能します。これは、Apache Webサーバーなどのマルチユーザー設定では、プリフォークMPM(つまり、ユーザーごとに1つのプロセス)でのみ機能することを意味します。ワーカーおよびその他のスレッド化されたMPMは機能しません。

さらに、多くのユーザーは、LANGなどのシステム環境変数を設定することによってGNUgettextを制御します。明らかな競合状態のため、これはWebサーバー環境には適していません。

http://www.php.net/manual/en/gettext.setup.php

于 2009-10-29T20:30:35.210 に答える
0

Windows 10 の PHP 5.6.30 VC11 Theard Safe でも同じ問題がありました。回避策が見つかり、この問題は sirio3mil によって修正れました。

どうやら PHP with TS は Locale language フォルダーにしかアクセスできないようです。そのため、setlocale や putenv 関数をシステム言語以外で呼び出した場合、.mo や .po を含むフォルダを読み込むことができません。

回避策は、システム言語を含む 1 つの言語フォルダーと、翻訳された言語ごとに複数の .mo/.po ファイルのペアを用意することです。ドメインは希望の言語で設定されます。

スイス フランス語、ドイツ語、イタリア語の例:

フォルダ構造

\Locale\fr_CH\LC_MESSAGES

  • fr_CH.mo + fr_CH.po // システム言語
  • de_CH.mo + de_CH.po
  • it_CH.mo + it_CH.po

コード

$lang = 'fr_CH' or 'de_CH' or 'it_CH'

bindtextdomain($lang, '.\Locale');
textdomain($lang);
bind_textdomain_codeset($lang, 'UTF-8');
setlocale (LC_ALL, $lang);
putenv('LC_ALL=' . $lang);
于 2017-02-10T09:29:31.130 に答える