PHP获取当前客户端操作系统语言

3

我想知道,是否有从PHP / javascript获取当前客户端操作系统语言的方法。我尝试使用$_SERVER["HTTP_ACCEPT_LANGUAGE"]但有时会得到错误的语言。 例如在Google Chrome中:

  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 这样做是为了尽可能地帮助用户(包括谷歌搜索结果,它们将基于您附近的一个主要城市..我的是斯德哥尔摩,我甚至不住在那里..而且我很清楚这是基于 IP/主机名的大量地理检测,但这是功能的基础)。 - Torxed
3
它说“zh”是我的主要语言。——不,它没说。由于“zh”没有明确的质量值,它的质量为“1.0”。这与“en-US”相同,因此“zh”和“en-US”具有相同的权重。 - Quentin
@Quentin 是正确的。也许你可以从用户代理字符串中获取一些信息。 - Tasso Evangelista
HTTP_USER_AGENT: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31,并没有什么实质性的帮助。但是如果 zh,en-US;q=0.8 的权重相等,那么选择就很困难了。由于我想要获取客户端操作系统语言而不是浏览器语言设置,难道还有其他方法吗? - user430926
3个回答

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

2

如何在IE上通过JavaScript发送它?

  • navigator.browserLanguage: 浏览器语言
  • navigator.systemLanguage: Windows系统语言
  • navigator.userLanguage: Windows用户特定的语言

感谢:有没有办法使用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];

这仅在IE中可用。 据我所知,没有办法识别所有主要浏览器下的操作系统语言。 - Kapil Sharma
正确的,可能需要提到。您需要在HTTP_ACCEPT_LANGUAGE上创建一个排序函数。 - Torxed

0

警告:据我所记得,该PHP函数实现不佳且结果较差。 - Terence
不确定实现是否糟糕,但唯一有功能的评论做得很好。 - unasAquila

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接