2013-05-07 75 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; 
} 
相关问题