Zend Framework には、Zend_Locale という優れたコンポーネントがあります。HTTP Accept-Language ヘッダーにハッキングされていることもあり、言語とロケールを適切に解析するには、あらゆる種類の核心的な詳細があります。
Zend Framework のlocale docsには、次のように書かれています。
注: ほとんどの人が考えているように、2 文字のロケールだけが存在するわけではないことに注意してください。また、省略形が2文字だけでない言語や地域もあります。そのため、地域や言語を自分で取り除くべきではありません。ロケール文字列から言語や地域を取り除きたい場合は Zend_Locale を使用してください。そうしないと、自分でこれを行うと、コード内で予期しない動作が発生する可能性があります。
完全。ただし、さまざまな言語の翻訳をテストしてきました。Firefox でブラウズすると仮定して、設定を変更し、いくつかの language_region プロファイルを追加します...デフォルトの順序を変更します。Zend はデフォルトのみをプルすることがわかります。ドキュメントでもそう言っています:
ユーザーがブラウザ内で複数のロケールを指定した場合、Zend_Locale は最初に見つかったロケールを使用します。ユーザーがロケールを指定しない場合、またはスクリプトがコマンド ラインから呼び出されている場合、自動ロケール「環境」が自動的に使用され、返されます。
これは残念です。5 つの言語が定義されている場合、ユーザーがブラウザーで定義したすべてのロケールを調べて、一致する言語を使用する必要があります...
だから私の質問は、完全なリストを解析して一致するものを引き出すためにどのようなアプローチをとりますか?
UPDATE 完全なリストを返す Zend_Locale::getBrowser() メソッドがあります。すごい!Zend_Translate が最初のものだけをプルするように見える理由がわかりません。それがどのように機能するかを確認してから戻ってきます...おそらく、翻訳した言語の配列を構築し、それを getBrowser() の結果と比較して、最初の一致を取得する必要があります。
UPDATE2 解決策を実装しましたが、Zend_Translate と Zend_Locale は小さな小さなクラスではないため、まだハッキーです。国際化は明らかに大きなトピックです。研究することはかなりあります。
しかし、本質的には、各言語がブラウザーの設定リストと一致するかどうかをチェックすることになります。