Я закодировал следующий материал, используя Accept-Language, как указали другие пользователи:
function GetAcceptedLangs()
{
$res=array();
$a=getallheaders();
if(isset($a["Accept-Language"]))
{
$aceptlangs=explode(",",str_replace(array(';','0','1','2','3','4','5','6','7','8','9','.',"q="),array(',','','','','','','','','','','','',""),$a["Accept-Language"]));
foreach($aceptlangs as $i=>$v)
{
if(trim($v)!="")
$res[]=trim($v);
}
}
return $res;
}
Простой
print_r(GetAcceptedLangs());
возврат в моем случае:
Array ( [0] => es-ES [1] => es [2] => en )
После этого вы можете определить такой массив, чтобы изменить его на значение вашего внутреннего языка, например:
$al={"ES-es"=>"es","es"=>"es","en"=>"en"......}
Они уже отсортированы по предпочтениям пользователя.
Если в массиве нет всех языков, вы можете перейти на язык по умолчанию на вашем сайте. Это также верно, если браузер не отправляет заголовок Accept-Language.
Другая версия, удаляющая значения субрегиона
function GetAcceptedLangs2()
{
$res=array();
$a=getallheaders();
if(isset($a["Accept-Language"]))
{
$aceptlangs=explode(",",str_replace(array(';','0','1','2','3','4','5','6','7','8','9','.',"q="),array(',','','','','','','','','','','','',""),$a["Accept-Language"]));
foreach($aceptlangs as $i=>$v)
{
$va=trim($v);
if(($pos=strpos($va,"-"))!==false)
$l=substr($va,0,$pos);
else
$l=$va;
if($l!="" && !isset($check[$l]))
{
$check[$l]=1;
$res[]=$l;
}
}
}
return $res;
}
Это вернулось бы в моем случае
Array ( [0] => es [1] => en )