PHPでユーザーのロケールを自動的に設定するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/326891

質問

ユーザーの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に依存します。または、ユーザーランドの実装については、マニュアルページのコメントを参照してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top