8

ユーザーの HTTP_ACCEPT_LANGUAGE を解析し、PHP でロケールを設定する簡単な方法はありますか?

Zend フレームワークにはこれを行う方法があることは知っていますが、その 1 つの機能を使用するためだけにフレームワーク全体をインストールしたくはありません。

PEAR I18Nv2 パッケージはベータ版で、ほぼ 3 年間変更されていないため、可能であれば使用したくありません。

また、Windows のロケール文字列は世界の他の地域とは異なるため、サーバーが Windows で実行されているかどうかを判断できると便利です... (ドイツ語は「de」ではなく「deu」または「german」です。 )

4

4 に答える 4

5

それはあるべきほど簡単ではありません(私の謙虚な意見では)。まず、からロケールを抽出し、$_SERVER['HTTP_ACCEPT_LANGUAGE']それらをq値で並べ替える必要があります。その後、指定されたロケールごとに適切なシステムロケールを取得する必要があります。これは、* nixマシンでは問題ありませんが(正しい文字セットに対処する必要がある場合のみ)、Windowsではロケールを次のように変換する必要があります。たとえば、Windowsロケールは次のde_DEようになりますGerman_Germany(たとえば、アプリでUTF-8を使用している場合は、文字セットの問題にも対処する必要があります)。この問題のルックアップテーブルを作成する必要があると思います-そして多くのロケールがあります;-)

qいいえ、を使用して一致するものが見つかるまで、次々にロケールを試します(降順の値でソートされます)(指定されたロケールを設定できなかった場合、setlocale()関数は戻ります)。false

しかし、その後、対処する最後の障害があります:

ロケール情報は、スレッドごとではなく、プロセスごとに維持されます。IISやWindows上のApacheなどのマルチスレッドサーバーAPIでPHPを実行している場合、スクリプト自体がsetlocale()自体を呼び出すことはありませんが、スクリプトの実行中にロケール設定が突然変更されることがあります。これは、同じプロセスの異なるスレッドで同時に実行されている他のスクリプトが、setlocale()を使用してプロセス全体のロケールを変更しているために発生します。

http://de2.php.net/manual/en/function.setlocale.phpを参照)

これは、異なるロケールが設定された別のユーザーがWebページにアクセスしたため、スクリプトの実行中に突然ロケールが変更される可能性があることを意味します。

したがって、上記Zend_LocaleはPHP関数(システムロケール情報を取得するためにのみ使用されます)に依存せず、代わりにUnicodeCLDRプロジェクトsetlocale()によって提供されるデータに基づくシステムを使用します。これにより、コンポーネントはこれらすべての問題から独立しますが、ロケール対応の文字列操作(たとえば、並べ替え)のサポートの欠如など、他のいくつかの欠陥も発生します。setlocale()

于 2008-11-29T10:39:32.213 に答える
2

Zendフレームワークにはこれを行う方法があることは知っていますが、その1ビットの機能を使用するためだけにフレームワーク全体をインストールしたくはありません。

Zendの良いニュースは、すべてをインストールする必要がないことです。これは疎結合のフレームワークであり、他のコンポーネントを使用せずにZend_Localeを使用することができます。たぶんあなたはそれをZend_Translateと組み合わせたいでしょう。

見てみな

于 2008-11-29T11:04:38.293 に答える
2

素晴らしい解決策が進行中です。

それがなければ、そのヘッダーを解析する必要があります。これは、セミコロンで区切られたロケールと属性のコンマ区切りのリストです。

次のようになります。

en_US, en;q=0.8, fr_CA;q=0.2, *;q=0.1

setlocale()そして、それが受け入れられるまで各ロケールを試してください。それらのいずれも一致しない可能性があることに注意してください。

一部のユーザーはブラウザーの構成を誤っている可能性があるため、重要すぎるものに基づいたり、ユーザーが上書きできるようにしたりしないでください。


Windows ロケールの場合、おそらく ISO 639-1 名を ISO 639-2/3 に変換する必要がありますか?

于 2008-11-29T02:09:13.850 に答える
1

ありますhttp_negotiate_languageが、http-extensionによって異なります。または、ユーザーランドの実装については、マニュアルページのコメントを参照してください。

于 2008-11-29T12:02:36.647 に答える