Utilicé la expresión regular de @GabrielAnderson y diseñé esta función que se comporta de acuerdo con RFC 261 6 (cuando no se otorga un valor de calidad a un idioma, se establece de manera predeterminada en 1).
Cuando varios idiomas comparten el mismo valor de calidad, los más específicos tienen prioridad sobre los menos específicos.(Este comportamiento no es parte de la RFC que proporciona ninguna recomendación para este caso concreto)
function Get_Client_Prefered_Language ($getSortedList = false, $acceptedLanguages = false)
{
if (empty($acceptedLanguages))
$acceptedLanguages = $_SERVER["HTTP_ACCEPT_LANGUAGE"];
// regex inspired from @GabrielAnderson on http://stackoverflow.com/questions/6038236/http-accept-language
preg_match_all('/([a-z]{1,8}(-[a-z]{1,8})*)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $acceptedLanguages, $lang_parse);
$langs = $lang_parse[1];
$ranks = $lang_parse[4];
// (create an associative array 'language' => 'preference')
$lang2pref = array();
for($i=0; $i<count($langs); $i++)
$lang2pref[$langs[$i]] = (float) (!empty($ranks[$i]) ? $ranks[$i] : 1);
// (comparison function for uksort)
$cmpLangs = function ($a, $b) use ($lang2pref) {
if ($lang2pref[$a] > $lang2pref[$b])
return -1;
elseif ($lang2pref[$a] < $lang2pref[$b])
return 1;
elseif (strlen($a) > strlen($b))
return -1;
elseif (strlen($a) < strlen($b))
return 1;
else
return 0;
};
// sort the languages by prefered language and by the most specific region
uksort($lang2pref, $cmpLangs);
if ($getSortedList)
return $lang2pref;
// return the first value's key
reset($lang2pref);
return key($lang2pref);
}
Ejemplo:
print_r(Get_Client_Prefered_Language(true, 'en,en-US,en-AU;q=0.8,fr;q=0.6,en-GB;q=0.4'));
Salidas:
Array
(
[en-US] => 1
[en] => 1
[en-AU] => 0.8
[fr] => 0.6
[en-GB] => 0.4
)
Como se puede notar, 'en -US 'aparece en la primera posición a pesar del hecho de que' en 'fue el primero en la cadena dada.
lo que podría utilizar esta función y simplemente reemplazar la primera línea de código por:
$http_lang = substr(Get_Client_Prefered_Language(),0,2);
La mejor manera es registrar direcciones IP y sus encabezados. Y examine los registros más adelante – zerkms
posible duplicado de [¿Cómo obtener el valor del idioma de $ _SERVER \ ['HTTP_ACCEPT_LANGUAGE' \] usando PHP?] (Http://stackoverflow.com/questions/2316476/how-to-get-the -language-value-from-serverhttp-accept-language-using-php) –
¿Podría ser un problema de caso? Cambiarlo para cambiar (strtolower ($ http_lang)) podría ayudar. Aunque no estoy seguro – mjec