2010-02-23 146 views
13
<?php 
$language = $_SERVER['HTTP_ACCEPT_LANGUAGE']; 
echo $language; 
?> 

當我使用Firefox測試的代碼塊,我得到en-us,en;q=0.7,ja;q=0.3

當我使用IE瀏覽器來測試的代碼塊

,我得到zh-cn

$_SERVER['HTTP_ACCEPT_LANGUAGE']一個字符串值?如何確定首選語言是中文還是日文?我如何寫一個正則表達式來得到的$_SERVER['HTTP_ACCEPT_LANGUAGE']值的語言?

+1

我只是想要得到喜歡的語言最優先。 – Steven 2010-02-23 08:06:07

+0

OR:來自wordpres插件的用戶函數:http:// wordpress。org/support/topic/wp_multilingual-and-http_accept_language – user956584 2012-08-20 01:01:42

回答

25

是的,$_SERVER['HTTP_ACCEPT_LANGUAGE']的值是一個字符串 - 見$_SERVER

其內容是由瀏覽器發送的 - 這也解釋了爲什麼你取決於你使用的瀏覽器不同的結果:最有可能的,你的Firefox配置爲請求在英語(高優先級)頁或日語(低優先級),而你的IE瀏覽器配置爲請求頁中國。

這是因爲HTTP標頭可包含:

  • 語言列表
  • optionnaly,與區域代碼
  • 具有相關聯的優先級。

這個想法是服務器應該回應,使用適合用戶所要求的「最好」的語言。


關於解析這個頭,這個博客,帖子可能是一個有趣的閱讀:Parse Accept-Language to detect a user's language

有建議解析HTTP頭的代碼的一部分 - 它產生一個數組,看起來像這樣(引用)

Array 
(
    [en-ca] => 1 
    [en] => 0.8 
    [en-us] => 0.6 
    [de-de] => 0.4 
    [de] => 0.2 
) 

這是語言的數組,按優先級排序,按降序排列 - 這可能是你想要的。

+0

這種方法很複雜。我想一個簡單的解決方案。我只想檢測日語,中文和英文。我對待en-ca和en-us一樣,只是英語。 – Steven 2010-02-23 08:04:55

+0

也許我可以使用strpos,我會試試。 – Steven 2010-02-23 08:07:29

3

我只是使用 explode(",",$_SERVER['HTTP_ACCEPT_LANGUAGE'])來獲得我的客戶端可能使用的第一種可能的語言。它在Chrome和IE 10上運行良好。不知道在其他瀏覽器上是否會出現問題。

2

試試這個:

function getUserBaseLanguage() { 
    global $_SERVER; 
    $accept_languages   = $_SERVER['HTTP_ACCEPT_LANGUAGE']; 
    $accept_languages_arr  = explode(",",$accept_languages); 
    foreach($accept_languages_arr as $accept_language) { 
     preg_match ("/^(([a-zA-Z]+)(-([a-zA-Z]+)){0,1})(;q=([0-9.]+)){0,1}/" , $accept_language, $matches); 
     if (!$matches[6]) $matches[6]=1; 
     $result[$matches[1]] = array(
      'lng_base' => $matches[2], 
      'lng_ext' => $matches[4], 
      'lng'  => $matches[1], 
      'priority' => $matches[6], 
      '_str'  => $accept_language, 
     ); 
    } 
    return $result; 
} 

print_r(getUserBaseLanguage()); 

輸出:

Array 
(
[pl] => Array 
    (
     [lng_base] => pl 
     [lng_ext] => 
     [lng] => pl 
     [priority] => 1 
     [_str] => pl 
    ) 

[en-US] => Array 
    (
     [lng_base] => en 
     [lng_ext] => US 
     [lng] => en-US 
     [priority] => 0.7 
     [_str] => en-US;q=0.7 
    ) 

[en] => Array 
    (
     [lng_base] => en 
     [lng_ext] => 
     [lng] => en 
     [priority] => 0.3 
     [_str] => en;q=0.3 
    ) 

) 
+0

運作良好!謝謝! – MortisQc 2015-07-15 13:26:29