【问题标题】:How to tell what is the user's preferred country/language?如何判断用户的首选国家/语言是什么?
【发布时间】:2011-06-06 02:02:21
【问题描述】:

有什么方法可以知道用户的语言 我想我必须先了解他的国家,然后根据它确定语言

【问题讨论】:

  • 你可以使用 apache geo_ip mod 来查找国家

标签: php


【解决方案1】:

任何原因$_SERVER["HTTP_ACCEPT_LANGUAGE"] 不起作用?

Accept-Language 的内容:当前请求的标头,如果有的话。示例:'en'。

http://php.net/manual/en/reserved.variables.server.php

【讨论】:

  • 请注意,Accept-Language 是加权值列表。所以它不一定只有一个值,第一个值不一定是最喜欢的值。
  • @moustafa:Google Bot 根本不会发送 Accept-Language 标头字段,如果这就是您所要求的。这意味着它接受任何语言。在这种情况下,您应该返回一个包含所有可用语言变体链接的页面。
【解决方案2】:

有多种方法。不过,我建议先查看Accept-Language

只有在没有这种情况时,您才应该考虑使用您提供的方法。这基本上是使用地理定位来获取国家或地区,然后猜测语言。

后者有很大缺陷,因为许多国家甚至地区都非常多语言。

【讨论】:

    【解决方案3】:

    首先:地理位置和用户的首选语言之间存在差异,您不能根据对方的知识来暗示一种信息。

    用户的地理位置可以通过 IP 地址的地理定位来确定。最好的解决方案是简单地询问用户他/她的首选语言。

    因为虽然浏览器通常会随请求发送一些语言首选项(请参阅Accept-Language header fieldmy answer on Detect Browser Language in PHP),但这些并不是当前使用浏览器的用户的实际语言首选项。

    【讨论】:

    • 当然,您可以使用Accept-Language 中的最佳选择(如果有)作为默认值,然后让用户轻松选择替代方案。
    • @Matthew Flaschen:是的,您可以使用该信息作为初始值。但最好问问用户。
    • 投反对票的原因是什么?我的回答有问题吗?
    • @Col。弹片:但是Accept-Language值的质量参数也可以禁止值:en;q=0表示English is inacceptable。如果可以取最佳值,为什么只取任意值?
    • @Col。弹片:我没有主张不使用自动检测。我说自动检测是可能的,但不像只取 Accept-Language 的第一个值那么容易,因为这不是最好的选择。只有在用户选择他/她的实际首选语言之前,才应使用自动检测到的值。
    【解决方案4】:

    大多数浏览器都会在请求中发送它们的默认语言环境。您可以通过
    $userLang = $_SERVER['HTTP_ACCEPT_LANGUAGE']

    检索此信息

    【讨论】:

      【解决方案5】:

      看看这个

      $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
      

      还有

      检查这个link

      【讨论】:

        【解决方案6】:

        如果$_SERVER['HTTP_ACCEPT_LANGUAGE']不够有用,你可以试试这个服务

        http://www.geoplugin.com/webservices/php

        【讨论】:

          【解决方案7】:

          如果您需要完整的语言名称而不是缩写(en、fr 等),请尝试以下基本功能:

          function parse_language( $languages = '' ) {
              $translation = array( 'en' => 'English', 'fr' => 'French', 'es' => 'Spanish', 'de' => 'German', 'ja' => 'Japanese');
              if( $languages == '' ) { //Default to HTTP accept language header
                  $languages = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
              }
              $languages = explode( ',', strtolower( $languages ) ); //Separate individual languages
              foreach( $languages as &$language ) { //Filter out any county codes like -US
                  if( strpos( $language, '-' ) !== false ) {
                      list( $language, ) = explode( '-', $language, 2 );
                  }
              }
              //Find the intersections between the translation keys and the language values 
              return( array_values( array_intersect_key( $translation, array_combine( $languages, array_fill( 0, count( $languages ), '' ) ) ) ) );
          }
          
          //Sample usage
          print_r( parse_language( 'en-US,de-GR,fr,es' ) );
          

          如果您需要更多语言支持,只需将更多键/值对添加到翻译数组。

          【讨论】:

            【解决方案8】:

            你可以使用

            http_negotiate_language($langs)
            

            link to documentation

            【讨论】:

              猜你喜欢
              • 2015-12-14
              • 2010-12-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-08-10
              • 1970-01-01
              • 2010-11-19
              相关资源
              最近更新 更多