2017-10-12 12 views
0

このコードには、さまざまな要因に応じて、各言語ごとに異なる回答があることがわかりました。PHPを使用してWebブラウザの言語を検出

たとえば、英語:en_EN、en-EN、en_GB、en_US、en-GB、en-US。 フランス語などの言語でも同じです。 私が探しているのは、それらのlangシノニムを見つけることができるので、私はそれらのすべてに適切なページ言語を提供できるからです。
今私は何を私が探していることはすべて英語とフランス語の可能性と、このようなアラビア語の何かを見つけることです、3言語を持っているために:

if (($lang=="en_EN") OR ($lang=="en-EN") OR ($lang=="en_GB") OR ($lang=="en_US") OR ($lang=="en-GB") OR ($lang=="en-US")) { 
    echo 'show English version'; 
}else if (($lang=="fr_FR") ......) { // i don't know the other like fr-FR ..... 
    echo 'show French version'; 
}else if (($lang=="ar_AR") ......) { // i don't know the other like ar-AR ..... 
    echo 'show Arabic version'; 
}else { 
    echo 'English as default'; 
} 

答えて

1

あなたの例に基づいて、それがいるようです言語のローカリゼーションには関心がありません(英語の場合は英語、アメリカの場合は英語など)。むしろあなたは言語の好みが英語であることだけを心配しています。

その場合、私はロケールの最初の2文字のみを使用することをお勧めします。

$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); 

これは関係なく、ローカライズの、など、あなたenfrarを返します。これを使用して、ユーザーに返されるコンテンツ言語を設定します。言語が存在しない場合は、サーバーに既定の言語を設定します。英語。

1

言語のみを気にする場合は、ロケールコードの最初の2文字を使用してください(例: enからen_USまでです。これらの文字は、ユーザーの優先言語のためのthe ISO 639-2 language codeを表します。

残りの文字は優先地域を表します。アメリカ英語の場合はen_US、英国英語の場合はen_GBです。 (国コードENの国がないため、en_ENは意味がありません)。地域を気にしない場合は、この部分を無視できます。ユーザーは1時間あたりのいくつかのlangsを読み取ることができることを意味よりも、$_SERVER['HTTP_ACCEPT_LANGUAGE'];区切り値を有することができるので、あなたが何を知りたい場合は、それらのすべてを確認することができます:あなたはこの実現を改善することができます

1
switch (substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2)) 
{ 
    case 'ar': break; # Arabic 
    case 'fr': break; # France 
    default: break; # English 
} 

あなたのリストから彼に提供するかもしれません。

1

次のことを試してみてください。

$lang = $lang[0].$lang[1]; 

それとも

$lang = substr($lang, 0, 2); 

それとも

$lang = mb_strimwidth($lang, 0, 2); 

これらのすべてがenのものであろう文字列の最初の2 charsを返します。 、fr,deなど

0

は、ISO 639-1(https://en.wikipedia.org/wiki/ISO_639-1)における言語の配列を取得し、これを試してください:$ rlangs Varの

$lang_parse=""; 
    preg_match_all('/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $lang_parse); 
    if (count($lang_parse[1])) { 
     $langs = array_combine($lang_parse[1], $lang_parse[4]); 
     foreach ($langs as $lang => $val) { 
      if($val === '') { 
       $rlangs[substr($lang, 0, 2)] = 1; 
      } else if (isset($rlangs[substr($lang, 0, 2)]) && $rlangs[substr($lang, 0, 2)] < $val) { 
       $rlangs[substr($lang, 0, 2)] = $val; 
      } 
     } 
     arsort($rlangs, SORT_NUMERIC); 
    } 

あなたはすべてのブラウザ受け入れ言語で配列を取得します。 受け入れられる言語が英語の場合、

array(1) { 
    ["en"]=>int(1) 
} 
関連する問題