猿问

在PHP中检测浏览器语言

在PHP中检测浏览器语言

我使用以下PHP脚本作为我的网站的索引。

这个脚本应该包含一个特定的页面,这取决于浏览器的语言(自动检测到)。

此脚本并不适用于所有浏览器,因此它总是包括index_en.php对于任何检测到的语言(问题的原因很可能是一些接受语言头没有被考虑的问题)。

你能给我一个更有力的解决方案吗?

<?php// Open session varsession_start();// views: 1 = first visit; >1 = second visit
// Detect language from user agent browserfunction lixlpixel_get_env_var($Var){
     if(empty($GLOBALS[$Var]))
     {
         $GLOBALS[$Var]=(!empty($GLOBALS['_SERVER'][$Var]))?
         $GLOBALS['_SERVER'][$Var] : (!empty($GLOBALS['HTTP_SERVER_VARS'][$Var])) ? $GLOBALS['HTTP_SERVER_VARS'][$Var]:'';
     }}function lixlpixel_detect_lang(){
     // Detect HTTP_ACCEPT_LANGUAGE & HTTP_USER_AGENT.
     lixlpixel_get_env_var('HTTP_ACCEPT_LANGUAGE');
     lixlpixel_get_env_var('HTTP_USER_AGENT');

     $_AL=strtolower($GLOBALS['HTTP_ACCEPT_LANGUAGE']);
     $_UA=strtolower($GLOBALS['HTTP_USER_AGENT']);

     // Try to detect Primary language if several languages are accepted.
     foreach($GLOBALS['_LANG'] as $K)
     {
         if(strpos($_AL, $K)===0)
         return $K;
     }

     // Try to detect any language if not yet detected.
     foreach($GLOBALS['_LANG'] as $K)
     {
         if(strpos($_AL, $K)!==false)
         return $K;
     }
     foreach($GLOBALS['_LANG'] as $K)
     {
         //if(preg_match("/[[( ]{$K}[;,_-)]/",$_UA)) // matching other letters (create an error for seo spyder)
         return $K;
     }


慕容森
浏览 784回答 3
3回答

梦里花落0921

你为什么不保持简单干净呢?<?php &nbsp;&nbsp;&nbsp;&nbsp;$lang&nbsp;=&nbsp;substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],&nbsp;0,&nbsp;2); &nbsp;&nbsp;&nbsp;&nbsp;$acceptLang&nbsp;=&nbsp;['fr',&nbsp;'it',&nbsp;'en'];&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;$lang&nbsp;=&nbsp;in_array($lang,&nbsp;$acceptLang)&nbsp;?&nbsp;$lang&nbsp;:&nbsp;'en'; &nbsp;&nbsp;&nbsp;&nbsp;require_once&nbsp;"index_{$lang}.php";&nbsp;?>

HUX布斯

现有的答案有点冗长,所以我创建了这个更小的、自动匹配的版本。function&nbsp;prefered_language(array&nbsp;$available_languages,&nbsp;$http_accept_language)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;$available_languages&nbsp;=&nbsp;array_flip($available_languages); &nbsp;&nbsp;&nbsp;&nbsp;$langs; &nbsp;&nbsp;&nbsp;&nbsp;preg_match_all('~([\w-]+)(?:[^,\d]+([\d.]+))?~',&nbsp;strtolower($http_accept_language),&nbsp;$matches,&nbsp;PREG_SET_ORDER); &nbsp;&nbsp;&nbsp;&nbsp;foreach($matches&nbsp;as&nbsp;$match)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list($a,&nbsp;$b)&nbsp;=&nbsp;explode('-',&nbsp;$match[1])&nbsp;+&nbsp;array('',&nbsp;''); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$value&nbsp;=&nbsp;isset($match[2])&nbsp;?&nbsp;(float)&nbsp;$match[2]&nbsp;:&nbsp;1.0; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(isset($available_languages[$match[1]]))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$langs[$match[1]]&nbsp;=&nbsp;$value; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(isset($available_languages[$a]))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$langs[$a]&nbsp;=&nbsp;$value&nbsp;-&nbsp;0.1; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;arsort($langs); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$langs;}以及样本的使用情况://$_SERVER["HTTP_ACCEPT_LANGUAGE"]&nbsp;=&nbsp;'en-us,en;q=0.8,es-cl;q=0.5,zh-cn;q=0.3'; //&nbsp;Languages&nbsp;we&nbsp;support$available_languages&nbsp;=&nbsp;array("en",&nbsp;"zh-cn",&nbsp;"es"); $langs&nbsp;=&nbsp;prefered_language($available_languages,&nbsp;$_SERVER["HTTP_ACCEPT_LANGUAGE"]);/*&nbsp;Result Array ( &nbsp;&nbsp;&nbsp;&nbsp;[en]&nbsp;=>&nbsp;0.8 &nbsp;&nbsp;&nbsp;&nbsp;[es]&nbsp;=>&nbsp;0.4 &nbsp;&nbsp;&nbsp;&nbsp;[zh-cn]&nbsp;=>&nbsp;0.3 )*/全部要点来源在这里
随时随地看视频慕课网APP
我要回答