PHPでユーザーのロケールを自動的に設定するにはどうすればよいですか?
-
11-07-2019 - |
質問
ユーザーのHTTP_ACCEPT_LANGUAGEを解析し、PHPでロケールを設定する簡単な方法はありますか?
Zendフレームワークにはこれを行う方法があることは知っていますが、その1ビットの機能を使用するためだけにフレームワーク全体をインストールすることは避けたいです。
PEAR I18Nv2パッケージはベータ版であり、ほぼ3年間変更されていないため、可能な場合は使用しません。
また、Windowsのロケール文字列は他の世界のロケール文字列とは異なるため、サーバーがWindowsで実行されているかどうかを判断できるといいでしょう...(ドイツ語は代わりに" deu"または" german"です" de"。)
解決
適切な解決策は、準備中です。
それなしでは、そのヘッダーを解析する必要があります。これは、セミコロンで区切られたロケールと属性のコンマ区切りリストです。
次のようになります:
en_US, en;q=0.8, fr_CA;q=0.2, *;q=0.1
次に、 setlocale()
が受け入れるまで各ロケールを試します。それらのどれも一致しない可能性があることに注意してください。
一部のユーザーはブラウザの設定を間違えている可能性があるため、あまりにも重要なものに基づいたり、ユーザーによる上書きを許可しないでください。
Windowsロケールの場合、おそらくISO 639-1の名前をISO 639-2 / 3に変換する必要がありますか?
他のヒント
それはあるべきほど簡単ではありません(私の謙虚な意見では)。まず、 $ _ SERVER ['HTTP_ACCEPT_LANGUAGE']
からロケールを抽出し、それらを q
値でソートする必要があります。その後、特定のロケールごとに適切なシステムロケールを取得する必要があります。これは、* nixマシンでは問題ないはずです(正しい文字セットに対処するだけでよい場合があります)が、Windowsではロケールをに変換する必要がありますWindowsロケール、たとえば de_DE
は German_Germany
になります(たとえば、アプリでUTF-8を使用している場合は、文字セットの問題にも対処する必要があります)。この問題のためにルックアップテーブルを作成する必要があると思います-そして多くのロケールがあります;-)
いいえ setlocale()
(指定されたロケールを設定できなかった場合、関数は false
を返します)。
しかし、次に対処する最後の障害があります:
ロケール情報は維持されます スレッドごとではなく、プロセスごと。もし、あんたが マルチスレッドでPHPを実行している IISやApacheなどのサーバーAPI 突然発生する可能性のあるウィンドウ ロケール設定の変更 スクリプトは実行されていますが、スクリプトは それ自体はsetlocale()を呼び出さない 自体。これは他の原因で起こります 異なるスレッドで実行されるスクリプト 同時に同じプロセスの を使用してプロセス全体のロケールを変更する setlocale()。
(参照: http://de2.php.net/manual/en /function.setlocale.php )
これは、異なるロケールが設定されている別のユーザーがWebページにヒットするだけなので、スクリプトの実行中に突然ロケールが変更される可能性があることを意味します。
したがって、前述の Zend_Locale
はPHP関数 setlocale()
に依存せず(システムロケール情報の取得にのみ使用されます)、代わりに Unicode CLDRプロジェクト。これにより、コンポーネントはこれらのすべての setlocale()
の問題から独立しますが、ロケールに対応した文字列操作のサポートの欠如(ソートなど)などの他の欠陥も導入します。
Zendフレームワークにはメソッドがあります これを行うが、私はむしろインストールしたくない フレームワーク全体を使用するだけです 1ビットの機能。
Zendの良いニュースは、すべてをインストールする必要がないことです。これは、疎結合フレームワークであり、他のコンポーネントを使用せずにZend_Localeを使用するだけです。たぶん、それをZend_Translateと組み合わせたいでしょう。
http_negotiate_language
、ただし、http-extensionに依存します。または、ユーザーランドの実装については、マニュアルページのコメントを参照してください。