如何使用PHP从$ _SERVER ['HTTP_ACCEPT_LANGUAGE']获取语言值?

时间:2010-02-23 07:46:50

标签: php regex http localization internationalization

<?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']的值中获取语言?

4 个答案:

答案 0 :(得分:28)

是的,$_SERVER['HTTP_ACCEPT_LANGUAGE']的值是一个字符串 - 请参阅$_SERVER

其内容由浏览器发送 - 这解释了为什么根据您使用的浏览器获得不同的结果:最有可能的是,您的Firefox配置为请求英文页面(高优先级)或日语(低优先级),而您的IE配置为请求中文页面。

这是因为HTTP标头可以包含:

  • 语言列表
  • optionnaly,区域代码
  • 与相关优先事项。

服务器应该使用适合用户要求的“最佳”语言进行响应。


关于解析该标题,此博客文章可能是一个有趣的读物: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']);

请参阅:http://php.net/manual/en/locale.acceptfromhttp.php

答案 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
    )

)