【问题标题】:How to get the language value from $_SERVER['HTTP_ACCEPT_LANGUAGE'] using PHP?如何使用 PHP 从 $_SERVER['HTTP_ACCEPT_LANGUAGE'] 获取语言值?
【发布时间】:2011-01-19 23:07:15
【问题描述】:
<?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'] 的值中获取语言?

【问题讨论】:

标签: php regex http localization internationalization


【解决方案1】:

是的,$_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
)

这是一个按优先级降序排列的语言数组——这可能是你想要的。

【讨论】:

  • 这个方法比较复杂。我想要一个简单的解决方案。我只想检测日文、中文和英文。我对待 en-ca 和 en-us 一样,只是英语。
  • 或许我可以用strpos,我试试看。
  • +1 即使在写了 10 年后,那篇博文中的代码仍然是最好的方法,完全可笑的是 PHP 中没有合适的内置
【解决方案2】:

我只是用 explode(",",$_SERVER['HTTP_ACCEPT_LANGUAGE']) 获得我的客户可能使用的第一种可能的语言。它在 chrome 和 IE 10 上运行良好。不确定在其他浏览器上是否会出错。

【讨论】:

    【解决方案3】:

    试试这个:

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

    【讨论】:

      【解决方案4】:

      从 v5.3 开始,PHP 具有用于此目的的功能:

      $locale = locale_accept_from_http($_SERVER['HTTP_ACCEPT_LANGUAGE']);
      

      见:http://php.net/manual/en/locale.acceptfromhttp.php

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多