【问题标题】:PHP get current client OS languagePHP 获取当前客户端操作系统语言
【发布时间】:2013-05-01 11:11:44
【问题描述】:

我想知道,有没有办法从 PHP/javascript 获得当前的客户端操作系统语言。我尝试使用$_SERVER["HTTP_ACCEPT_LANGUAGE"],但有时会使用错误的语言。 例如在谷歌浏览器中:

  1. 我的操作系统:Windows 7
  2. 语言:英语

使用$_SERVER["HTTP_ACCEPT_LANGUAGE"]我得到了这个结果:

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

它说“zh”是我的主要语言。

还有其他方法可以获取客户端操作系统语言吗?因为那是我想要的,而不是浏览器语言设置。谢谢

【问题讨论】:

  • zh 是因为您的浏览器检测到您居住在该国家/地区,因此您应该将该语言作为您的主要语言。 Chrome 这样做是为了尽可能地帮助用户(包括谷歌搜索结果,它们将基于你附近的一个主要城市.. 我的是斯德哥尔摩,我什至不住在附近.. 是的,我很清楚这是基于 IP/主机名的大量地理检测,但这是功能的基线)
  • 它说“zh”是我的主要语言。 — 不,它不是。由于zh 没有明确的质量值,它的质量为1.0。这与en-US 的质量相同,因此zhen-US 具有相同的权重。
  • @Quentin 是对的。也许你可以从用户代理字符串中得到一些东西。
  • 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 具有相同的权重,则很难选择。由于我想获取客户端操作系统语言而不是浏览器语言设置,还有其他方法吗?

标签: php language-detection


【解决方案1】:

在 IE 上通过 javascript 发送?

  • 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];

【讨论】:

  • 这仅在 IE 中可用。据我所知,没有办法识别在所有主流浏览器下都可以使用的操作系统语言。
  • 正确,应该提到这一点。您必须在 HTTP_ACCEPT_LANGUAGE 上创建一个排序功能。
【解决方案2】:

【讨论】:

  • 警告:据我所知,PHP 函数实现得很差,结果也很差。
  • 不确定实施是否很差,但唯一有功能的评论做得很好。
【解决方案3】:

试试这个功能

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 2018-07-24
    相关资源
    最近更新 更多