2013-05-07 72 views
3

我想知道,是否有任何方式從PHP/JavaScript獲取當前客戶端操作系統語言。我試圖使用$_SERVER["HTTP_ACCEPT_LANGUAGE"],但有時會得到錯誤的語言。 例如,在谷歌Chrome瀏覽器:PHP獲取當前客戶端操作系統語言

  1. 我的操作系統:Windows 7
  2. 語言:

使用$_SERVER["HTTP_ACCEPT_LANGUAGE"]我得到了這樣的結果:

HTTP_ACCEPT_LANGUAGE: zh,en-US;q=0.8,en;q=0.6 

它說 「zh」 表示我的主要語言。

有沒有其他方法可以獲得客戶端操作系統語言?因爲這就是我想要的,而不是瀏覽器語言設置。謝謝

+2

'zh'是由於您的瀏覽器檢測到您居住在該國,因此你應該收到該語言作爲您的主要語言。 Chrome會盡可能地幫助用戶(包括谷歌搜索結果,他們將基於你附近的一個主要城市..我的是斯德哥爾摩,我甚至沒有住在附近..是的,我很好awware這是基於IP /主機名的很多地理檢測,但這是功能的基準) – Torxed 2013-05-07 13:16:47

+3

*它表示「zh」是我的主要語言。* - 不,它不是。由於'zh'沒有明確的質量值,因此其質量爲'1.0'。這與'en-US'具有相同的質量,因此'zh'和'en-US'具有相同的權重。 – Quentin 2013-05-07 13:17:40

+0

@Quentin是對的。也許你可以從用戶代理字符串中得到一些東西 – 2013-05-07 13:19:20

回答

1

通過IE瀏覽器發送它?

  • navigator.browserLanguage:瀏覽器語言
  • navigator.systemLanguage:Windows系統的語言
  • navigator.userLanguage:Windows用戶特定的語言

感謝:Is there anyway to detect OS language using javascript?

這是唯一的辦法,除了一個你已經提到要獲得客戶端的語言操作系統,PHP由服務器運行,沒有別的。

構建PHP排序函數。

HTTP_ACCEPT_LANGUAGE: zh,en-US;q=0.8,en;q=0.6 

zhen-US共享相同的q=值,這意味着你可以在最高的語言值和默認排序爲en-US如果質量上兩種語言相同。

只是注意到@Quentin在我編輯前一分鐘的評論部分提到了這一點,做得好的先生!

樣機:

$languages = $_SERVER['HTTP_ACCEPT_LANGUAGE']; 
$default = 'en-US'; 
/* 
* magic split and structure the language into a array sorted by quality 
* 
* $languages_sorted_by_quality = array(0.8 => ('zh', 'en-US')); 
*/ 
$top_languages = max($languages_sorted_by_quality); 
if (isset($top_languages[$default])) { 
    $language = $default; 
else 
    $language = $top_languages[0]; 
+0

這僅在IE中可用。 據我所知,沒有辦法確定在所有主流瀏覽器下工作的操作系統語言。 – 2013-05-07 13:23:19

+0

正確的,應該提到的。你必須在'HTTP_ACCEPT_LANGUAGE'上做一個排序功能。 – Torxed 2013-05-07 13:23:50

0
+0

警告:據我所知,該PHP功能執行不力,並有一些不良結果。 – Terence 2013-05-07 13:24:54

+0

不確定實施差,但唯一有功能的評論做得很好。 – unasAquila 2013-05-07 13:34:49

4

試試這個功能

function getUserLanguage() { 
$langs = array(); 
if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { 
// break up string into pieces (languages and q factors) 
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])) { 
// create a list like â??enâ?? => 0.8 
$langs = array_combine($lang_parse[1], $lang_parse[4]); 
// set default to 1 for any without q factor 
foreach ($langs as $lang => $val) { 
if ($val === '') $langs[$lang] = 1; 
} 
// sort list based on value 
arsort($langs, SORT_NUMERIC); 
} 
} 
//extract most important (first) 
foreach ($langs as $lang => $val) { break; } 
//if complex language simplify it 
if (stristr($lang,"-")) {$tmp = explode("-",$lang); $lang = $tmp[0]; } 
return $lang; 
} 
相關問題