<?php
$language = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
echo $language;
?>
当我使用Firefox测试这段代码时,我得到en-us,en;q=0.7,ja;q=0.3
,
当我使用IE来测试代码块时,我得到zh-cn
。
$_SERVER['HTTP_ACCEPT_LANGUAGE']
的值是字符串吗?如何确定首选语言是中文还是日文?如何编写正则表达式以从$_SERVER['HTTP_ACCEPT_LANGUAGE']
的值中获取语言?
答案 0 :(得分:28)
是的,$_SERVER['HTTP_ACCEPT_LANGUAGE']
的值是一个字符串 - 请参阅$_SERVER
。
其内容由浏览器发送 - 这解释了为什么根据您使用的浏览器获得不同的结果:最有可能的是,您的Firefox配置为请求英文页面(高优先级)或日语(低优先级),而您的IE配置为请求中文页面。
这是因为HTTP标头可以包含:
服务器应该使用适合用户要求的“最佳”语言进行响应。
关于解析该标题,此博客文章可能是一个有趣的读物:Parse Accept-Language to detect a user's language
建议使用一部分代码来解析HTTP头 - 它会生成一个类似于(引用)的数组:
Array
(
[en-ca] => 1
[en] => 0.8
[en-us] => 0.6
[de-de] => 0.4
[de] => 0.2
)
这是一个语言数组,按优先级排序,按降序排列 - 这可能就是你想要的。
答案 1 :(得分:6)
从v5.3开始,PHP具有用于此目的的功能:
$locale = locale_accept_from_http($_SERVER['HTTP_ACCEPT_LANGUAGE']);
答案 2 :(得分:4)
我只是用
explode(",",$_SERVER['HTTP_ACCEPT_LANGUAGE'])
获取客户端可能使用的第一种语言。它在chrome和IE 10上工作正常。不确定在其他浏览器上是否会出错。
答案 3 :(得分:2)
试试这个:
function getUserBaseLanguage() {
global $_SERVER;
$accept_languages = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$accept_languages_arr = explode(",",$accept_languages);
foreach($accept_languages_arr as $accept_language) {
preg_match ("/^(([a-zA-Z]+)(-([a-zA-Z]+)){0,1})(;q=([0-9.]+)){0,1}/" , $accept_language, $matches );
if (!$matches[6]) $matches[6]=1;
$result[$matches[1]] = array(
'lng_base' => $matches[2],
'lng_ext' => $matches[4],
'lng' => $matches[1],
'priority' => $matches[6],
'_str' => $accept_language,
);
}
return $result;
}
print_r(getUserBaseLanguage());
输出:
Array
(
[pl] => Array
(
[lng_base] => pl
[lng_ext] =>
[lng] => pl
[priority] => 1
[_str] => pl
)
[en-US] => Array
(
[lng_base] => en
[lng_ext] => US
[lng] => en-US
[priority] => 0.7
[_str] => en-US;q=0.7
)
[en] => Array
(
[lng_base] => en
[lng_ext] =>
[lng] => en
[priority] => 0.3
[_str] => en;q=0.3
)
)