PHP Gettextの問題(非スレッドセーフなど)
-
22-07-2019 - |
質問
Webプロジェクト(PHP 5)で翻訳を処理するためにgettextの使用を開始したい。広く使用されている標準で評判が良いため、これが最良の選択のようです。
ただし、サーバーの互換性がなく、スレッドセーフではないという話も聞いています。これは、それを使用する私のプロジェクトにとって何を意味しますか?私は多くの人が使用するものを構築するので、私のコードが機能することが非常に重要です。
軽度の問題(PHP 4をまだ使用している人など)や、Webサーバーでのgettextの配布やインストールなどの重大な問題について話しているのですか?
解決
スレッドの問題は、組み込みPHP(Apacheのmod-phpなど)を使用し、スレッドを使用するサーバー(worker-mpmを備えたApacheサーバーなど)を実行する場合にのみ適用されます。
したがって、次の場合、スレッドセーフの問題は当てはまりません。
- NGINXサーバーを使用します(スレッドを使用しません)。
- Apache(スレッド化されたMPMの有無にかかわらず)とPHPをfastcgiモードで使用します
- Apacheを非スレッドMPM(prefork-MPMとして)およびPHPをmod-phpモードで使用します。
だから-デフォルトのApacheインストールのほとんどの人は、gettextがスレッドセーフでないことを心配するべきではありません。
PSまた、Windows上のApacheはスレッド化されていることに注意してください。
他のヒント
PHPマニュアルのコメント部分でさらに情報を更新する必要があると思います。...gettextセクションのマニュアルのコメントの1つ
GNU gettextライブラリは スレッドごとではなく、プロセスごと。 これは、マルチユーザーで Apache Webサーバーなどの設定 prefork MPMでのみ動作します (つまり、ユーザーごとに1つのプロセス)。ワーカー その他のスレッドMPMは機能しません。
さらに、多くのユーザーがGNUを制御します システム環境を設定してgettext LANGなどの変数。これは Webサーバーに適したソリューション 明らかな人種による環境 条件。
Windows 10上のPHP 5.6.30 VC11 Theard Safeで同じ問題が発生しました。この問題を回避し、修正しますこちら by sirio3mil。
明らかに、TSを使用したPHPはロケール言語フォルダーにのみアクセスできます。したがって、setlocaleおよびputenv関数がシステムの言語とは別の言語で呼び出された場合、.moおよび.poのフォルダーは読み取れません。
回避策は、システム言語と、翻訳された言語ごとに複数の.mo / .poファイルのペアを持つ言語フォルダーを1つだけにすることです。ドメインは希望の言語で設定されます。
スイスのフランス語、ドイツ語、イタリア語の例:
フォルダー構造
\ 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);