ユーザー言語の有能な定義

現在、私はグローバルで、自然で、多言語であると主張するサイトで作業しています。



異なる言語で情報を表示する方法についての話はありません。 ユーザーの言語を判断する方法について説明し、サイトで利用可能な最適な言語バージョンを選択します。



読むのが面倒な人- スクリーンキャストを見てください。うまくいかなかったので、ここに投稿しません。



そして、私たちは持っています:



チャレンジ:

ユーザーの言語を定義し、ユーザーがロシア語を話す場合(ロシア語、ベラルーシ、ウクライナの全リストはこちら )、ロシア語で情報を表示します。 そうでない場合は、英語で。

これらはすべて、ユーザーの言語からサイトでの理解に最適な言語へのリンクなどをすばやく設定できる機能を備えたクラスまたは関数の形式で作成する必要があります。



解決策:

ユーザーの言語を決定するために、スーパーグローバル配列$ _SERVERを使用するか、その要素$ _SERVER ['HTTP_ACCEPT_LANGUAGE']を使用して、言語に関するクライアントの設定を記述します。 この情報は、クライアントがサーバーに送信するAccept-Language HTTPヘッダーから抽出されます。

私の場合、それは文字列でした

ru-ru,ru;q=0.8,en-us;q=0.6,en;q=0.4
      
      





この行には、ユーザーが好むユーザーの言語が含まれており、その優先順位はqで表されます。言語にqが指定されていない場合は、1であると想定されます。

 Array ( [ru-ru] => 1 [ru] => 0.8 [en-us] => 0.6 [en] => 0.4 )
      
      





これは、私がロシア語を好み、2番目に英語を持っていることを示しています。

言語は2つの形式で書かれており、私の場合、 主な言語コードは「ru」と「en」で、これは言語標準ISO 639を参照しています

私の場合、 メイン言語コードは拡張言語コードです。ここでは「ru-ru」と「en-us」です。拡張言語コードは、使用する言語の地域が米国であることを示しています。

ISOコードリストに2文字と3文字のコード(時には複数の3文字コード)の両方が含まれている場合、言語をマークする方法について誤解が生じることがあります。 現在、すべての有効なコードが1つのIANAレジストリにリストされています 。これは、言語に対してISOリストから1つの値のみを受け入れます。 2文字のISOコードが利用可能な場合、それはレジストリにあります。 それ以外の場合、レジストリには3文字のコードが1つ含まれます。 これは物事を簡素化します。



理論を整理し、実践に移ります。

クラスコントローラーのコンストラクターを記述しましょう。

 public function __construct() { if (($list = strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE']))) { if (preg_match_all('/([az]{1,8}(?:-[az]{1,8})?)(?:;q=([0-9.]+))?/', $list, $list)) { $this->language = array_combine($list[1], $list[2]); foreach ($this->language as $n => $v) $this->language[$n] = $v ? $v : 1; arsort($this->language, SORT_NUMERIC); } } else $this->language = array(); }
      
      





ここでは、$ _SERVER ['HTTP_ACCEPT_LANGUAGE']によって返された文字列を処理して、次の形式の配列を見つけます。

 Array ( [ru-ru] => 1 [ru] => 0.8 [en-us] => 0.6 [en] => 0.4 )
      
      





言語の優先度の降順でソート(q値)



次に、最適な言語を見つけるメソッドを作成します。

最初のパラメーターにはデフォルト言語が渡され、2番目の配列はサイト上の言語になり、他の言語からのリンクの値は配列のようになります。

 $langs=array( 'ru'=>array('ru','be','uk','ky','ab','mo','et','lv'), 'de'=>'de' );
      
      





メソッドコード:

  public function getBestMatch($default, $langs) { $languages=array(); foreach ($langs as $lang => $alias) { if (is_array($alias)) { foreach ($alias as $alias_lang) { $languages[strtolower($alias_lang)] = strtolower($lang); } }else $languages[strtolower($alias)]=strtolower($lang); } foreach ($this->language as $l => $v) { $s = strtok($l, '-'); //          "en-us, ru-ru" if (isset($languages[$s])) return $languages[$s]; } return $default; }
      
      





この関数は、 メイン言語コードの形式の言語を削減します-メイン言語コードの形式への拡張言語コード 英語版とアメリカ版の言語が必要になることはほとんどありませんが、必要に応じていつでも追加できます。

その実行結果は、 ISO 639形式の最適なユーザー言語になり、デフォルト言語として英語を転送し、$ langs配列にないすべての言語に対してenが返されます。



ここからライブラリをダウンロードしてください



All Articles