2017-10-12 184 views
0

我發現對於每種語言的此代碼有不同的響應,取決於很多因素。使用PHP檢測Web瀏覽器語言

$lang = locale_accept_from_http($_SERVER['HTTP_ACCEPT_LANGUAGE']); 
echo $lang; 

例如英語語言:en_EN,en-EN,en_GB,en_US,en-GB,en-US。 對於法語和其他語言也是如此。 我在找什麼是我在哪裏可以找到這些郎同義詞,所以我可以爲他們每個人提供正確的頁面語言。
現在我有一個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

根據你的榜樣,似乎你不關心語言本地化(例如,如果它是英國英語或美國英語)。相反,你只關心語言偏好是英語。

既然如此,我建議只從區域設置中取前兩個字符。

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

這將返回enfrar等,無論定位。使用它來設置返回給用戶的內容語言,如果語言不存在,則使用默認語言(例如,英語。

1

如果您只關心語言,可以使用語言環境代碼的前兩個字符,例如enen_US。這些字符代表用戶首選語言的the ISO 639-2 language code

其餘字符表示優選區域,例如,美式英語爲en_US,英式英語爲en_GB。 (en_EN沒有意義,因爲沒有國家代碼爲EN。)如果您不關心該地區,則可以忽略此部分。

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

您可以改善這種認識:$_SERVER['HTTP_ACCEPT_LANGUAGE']可能有;分隔值,比意味着用戶能夠讀取每一段LANGS,這樣你就可以檢查所有這些,如果你想知道你的可能會從你的名單中提供給他。

1

嘗試以下操作:

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

或者

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

或者

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

所有這些都將返回字符串的第2 chars,這將是一個enfr,de等。

0

嘗試使用此方法得到的語言陣列,ISO 639-1(https://en.wikipedia.org/wiki/ISO_639-1):

$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); 
    } 

在$ rlangs VAR你會得到所有的瀏覽器接受語言的數組。 如果接受的語言是英語,您會得到:

array(1) { 
    ["en"]=>int(1) 
}