我想知道,有没有办法从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,英语;q=0.6

上面说“zh”是我的母语。

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

4
  • 2
    zh(德国)是因为您的浏览器检测到您居住在那个国家,因此您应该将该语言作为您的主要语言。Chrome这样做是为了尽可能地帮助用户(包括谷歌搜索结果,它们将基于你附近的一个主要城市…我的城市是斯德哥尔摩,我甚至不住在附近…是的,我很清楚这是基于IP/主机名的大量地理检测,但这是功能的基准)
    – 扭转的
    评论 2013年5月7日13:16
  • 上面说“zh”是我的母语。-不,没有。因为zh(德国)没有明确的质量值,它的质量为1。这与en-美国,因此zh(德国)en-美国重量相等。
    – 昆汀
    评论 2013年5月7日13:17
  • @昆廷是对的。也许您可以从用户代理字符串中获得一些信息。 评论 2013年5月7日13:19
  • HTTP_USER_AGENT:Mozilla/5.0(Windows NT 6.1)AppleWebKit/537.31(KHTML,如Gecko)Chrome/26.0.1410.64 Safari/537.31,没有多大帮助。但如果是zh,en-US;q=0.8的权重相等,很难选择。既然我想获得客户端操作系统语言而不是浏览器语言设置,还有其他方法吗? 评论 2013年5月8日2:25

3个答案

重置为默认值
4

试试这个功能

函数getUserLanguage(){$langs=数组();如果(isset($_SERVER['HTTP_ACCEPT_LANGUAGE']){//将字符串分解为多个部分(语言和q因子)预匹配('/([a-z]{1,8}(-[a-z]{1,8{)?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))/我',$_SERVER['HTTP_ACCEPT_LANGUAGE'],$lang_parse);if(计数($lang_parse[1])){//创建一个类似“”的列表??恩??=>0.8$langs=array_combine($lang_parse[1],$lang_pares[4]);//对于任何不带q因子的值,将默认值设置为1foreach($langs作为$lang=>$val){如果($val==='')$langs[$lang]=1;}//基于值的排序列表arsort($langs,SORT_NUMERIC);}}//提取最重要的(第一)foreach($langs作为$lang=>$val){break;}//如果复杂语言可以简化它if(stristr($lang,“-”){$tmp=爆炸(“-”,$lang);$lang=$tmp[0];}返回$lang;}
2

在IE上通过javascript发送?

  • navigator.browser语言:浏览器语言
  • 导航器.systemLanguage:Windows系统语言
  • 导航器.userLanguage:Windows用户特定语言

感谢:是否有使用javascript检测操作系统语言的方法?

除了你提到的方法外,这是唯一一种获得语言的方法客户操作系统,PHP由服务器运行,其他什么都不运行。

构建一个PHP排序函数。

HTTP_ACCEPT_LANGUAGE:zh,美国;q=0.8,英语;q=0.6

zh(德国)en-美国分享相同的q个=值,这意味着您可以根据最高的语言值进行排序,如果两种语言的质量相同,则默认为en-US。

刚刚注意到@Quentin在我编辑之前一分钟在评论部分提到了这一点,干得好,先生!

实物模型:

$languages=$_SERVER['HTTP_ACCEPT_LANGUAGE'];$default='en-US';/**魔术般地将语言拆分并构造成按质量排序的数组**$languages_sorted_by_quality=数组(0.8=>('zh','en-US'));*/$top_languages=最大值($languages_sorted_by_quality);if(isset($top_languages[$default])){$language=$default;其他的$language=$top_languages[0];
2
  • 这只在IE中可用。据我所知,没有办法识别在所有主要浏览器下工作的操作系统语言。 评论 2013年5月7日13:23
  • 正确,应该提到这一点。你必须在HTTP_ACCEPT_语言.
    – 扭转的
    评论 2013年5月7日13:23
0

你试过了吗http_谈判语言

2
  • 警告:据我所知,PHP函数实现得很差,并且有一些糟糕的结果。
    – 特伦斯
    评论 2013年5月7日13:24
  • 不确定实现是否差,但唯一有功能的注释做得很好。 评论 2013年5月7日13:34

您的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.