【问题标题】:How to get user language by ip address using php?如何使用 php 通过 ip 地址获取用户语言?
【发布时间】:2012-11-15 03:00:18
【问题描述】:

我需要使用 PHP 获取通过 IP 地址访问我网站的用户的语言。我该怎么做,有什么API可以做到这一点,请指教

【问题讨论】:

  • 我不同意@F4r-20,这是在询问用户的语言,而不是国家/地区。
  • 话虽如此,@sathyan,这可能是您必须猜测的事情,因为我可以拥有澳大利亚 IP 地址,但只会说西班牙语(例如)。
  • @GlaciesofPacis 还不错。在这种情况下,没有 - 没有办法从他们的 IP 地址中计算出(并且完全准确)用户的语言。
  • @F4r-20 - 我同意这种观点。可能最好的方法是使用 PECL (php.net/manual/en/function.http-negotiate-language.php)

标签: php ip-address


【解决方案1】:

您可以使用任何 geoIP 模块。它允许您通过 IP 检测国家/地区。但这不是很正确的方法。例如我现在在泰国(我有泰国 IP),但我的语言是俄语 :)

当谷歌显示泰语页面时,这不是很好。

对于检测语言,您可以使用浏览器中的标题。首选语言列在此标头中。

【讨论】:

【解决方案2】:

虽然您可以查找 IP 地址以了解大致的物理位置,但物理位置可能与您正在查找其 IP 地址的人的语言没有太大关系。

例如,虽然 IP 位置可能是美国的纽约地区,但该人可能会说普通话作为他们的主要语言,因为他们正在访问该地区。

这是一个可用于 IP 地址查找的服务http://ipinfodb.com/ip_location_api.php

这里是一个 stackoverflow 讨论 Get user location by IP address in C#,可能也有帮助。

但是,您需要提供一种允许更改语言选择的机制。并使用 cookie 或类似的东西来记住语言选择。

位置信息最常见的用途是提供更有可能对该位置的人有用的有针对性的广告。

编辑:使用移动设备

由于通过高速 3G 和 4G 蜂窝网络访问互联网的移动设备和智能手机变得越来越普遍,问题是 IP 地址地理定位是否适用于这些类型的设备。

简短的回答是,不太好。请参阅这篇文章,来自 Microsoft Research 的 Where's that Phone?: Geolocating IP Addresses on 3G Networks

另外,这是stackoverflow question on mobile phone location from a HTTP request

这是一篇文章,Geolocating IP addressesin Cellular Data Networks,它也提供了有关该问题的一些信息。

【讨论】:

    【解决方案3】:

    按照之前的建议使用 GeoIP 模块,然后将此代码插入项目中的某处:

    if($country = geoip_country_code_by_name($host))
    {
        switch($country)
        {
            case "DJ":
            case "ER":
            case "ET":
    
                $lang = "aa";
                break;
    
            case "AE":
            case "BH":
            case "DZ":
            case "EG":
            case "IQ":
            case "JO":
            case "KW":
            case "LB":
            case "LY":
            case "MA":
            case "OM":
            case "QA":
            case "SA":
            case "SD":
            case "SY":
            case "TN":
            case "YE":
    
                $lang = "ar";
                break;
    
            case "AZ":
    
                $lang = "az";
                break;
    
            case "BY":
    
                $lang = "be";
                break;
    
            case "BG":
    
                $lang = "bg";
                break;
    
            case "BD":
    
                $lang = "bn";
                break;
    
            case "BA":
    
                $lang = "bs";
                break;
    
            case "CZ":
    
                $lang = "cs";
                break;
    
            case "DK":
    
                $lang = "da";
                break;
    
            case "AT":
            case "CH":
            case "DE":
            case "LU":
    
                $lang = "de";
                break;
    
            case "MV":
    
                $lang = "dv";
                break;
    
            case "BT":
    
                $lang = "dz";
                break;
    
            case "GR":
    
                $lang = "el";
                break;
    
            case "AG":
            case "AI":
            case "AQ":
            case "AS":
            case "AU":
            case "BB":
            case "BW":
            case "CA":
            case "GB":
            case "IE":
            case "KE":
            case "NG":
            case "NZ":
            case "PH":
            case "SG":
            case "US":
            case "ZA":
            case "ZM":
            case "ZW":
    
                $lang = "en";
                break;
    
            case "AD":
            case "AR":
            case "BO":
            case "CL":
            case "CO":
            case "CR":
            case "CU":
            case "DO":
            case "EC":
            case "ES":
            case "GT":
            case "HN":
            case "MX":
            case "NI":
            case "PA":
            case "PE":
            case "PR":
            case "PY":
            case "SV":
            case "UY":
            case "VE":
    
                $lang = "es";
                break;
    
            case "EE":
    
                $lang = "et";
                break;
    
            case "IR":
    
                $lang = "fa";
                break;
    
            case "FI":
    
                $lang = "fi";
                break;
    
            case "FO":
    
                $lang = "fo";
                break;
    
            case "BE":
            case "FR":
            case "SN":
    
                $lang = "fr";
                break;
    
            case "IL":
    
                $lang = "he";
                break;
    
            case "IN":
    
                $lang = "hi";
                break;
    
            case "HR":
    
                $lang = "hr";
                break;
    
            case "HT":
    
                $lang = "ht";
                break;
    
            case "HU":
    
                $lang = "hu";
                break;
    
            case "AM":
    
                $lang = "hy";
                break;
    
            case "ID":
    
                $lang = "id";
                break;
    
            case "IS":
    
                $lang = "is";
                break;
    
            case "IT":
    
                $lang = "it";
                break;
    
            case "JP":
    
                $lang = "ja";
                break;
    
            case "GE":
    
                $lang = "ka";
                break;
    
            case "KZ":
    
                $lang = "kk";
                break;
    
            case "GL":
    
                $lang = "kl";
                break;
    
            case "KH":
    
                $lang = "km";
                break;
    
            case "KR":
    
                $lang = "ko";
                break;
    
            case "KG":
    
                $lang = "ky";
                break;
    
            case "UG":
    
                $lang = "lg";
                break;
    
            case "LA":
    
                $lang = "lo";
                break;
    
            case "LT":
    
                $lang = "lt";
                break;
    
            case "LV":
    
                $lang = "lv";
                break;
    
            case "MG":
    
                $lang = "mg";
                break;
    
            case "MK":
    
                $lang = "mk";
                break;
    
            case "MN":
    
                $lang = "mn";
                break;
    
            case "MY":
    
                $lang = "ms";
                break;
    
            case "MT":
    
                $lang = "mt";
                break;
    
            case "MM":
    
                $lang = "my";
                break;
    
            case "NP":
    
                $lang = "ne";
                break;
    
            case "AW":
            case "NL":
    
                $lang = "nl";
                break;
    
            case "NO":
    
                $lang = "no";
                break;
    
            case "PL":
    
                $lang = "pl";
                break;
    
            case "AF":
    
                $lang = "ps";
                break;
    
            case "AO":
            case "BR":
            case "PT":
    
                $lang = "pt";
                break;
    
            case "RO":
    
                $lang = "ro";
                break;
    
            case "RU":
            case "UA":
    
                $lang = "ru";
                break;
    
            case "RW":
    
                $lang = "rw";
                break;
    
            case "AX":
    
                $lang = "se";
                break;
    
            case "SK":
    
                $lang = "sk";
                break;
    
            case "SI":
    
                $lang = "sl";
                break;
    
            case "SO":
    
                $lang = "so";
                break;
    
            case "AL":
    
                $lang = "sq";
                break;
    
            case "ME":
            case "RS":
    
                $lang = "sr";
                break;
    
            case "SE":
    
                $lang = "sv";
                break;
    
            case "TZ":
    
                $lang = "sw";
                break;
    
            case "LK":
    
                $lang = "ta";
                break;
    
            case "TJ":
    
                $lang = "tg";
                break;
    
            case "TH":
    
                $lang = "th";
                break;
    
            case "TM":
    
                $lang = "tk";
                break;
    
            case "CY":
            case "TR":
    
                $lang = "tr";
                break;
    
            case "PK":
    
                $lang = "ur";
                break;
    
            case "UZ":
    
                $lang = "uz";
                break;
    
            case "VN":
    
                $lang = "vi";
                break;
    
            case "CN":
            case "HK":
            case "TW":
    
                $lang = "zh";
                break;
    
            default:break;
        }
    }
    

    【讨论】:

    • 没有更简单的方法吗?看起来很可怕!
    • 它不一定要好看...把它包裹在一个函数中,如果它伤害了你的眼睛,永远不要再看它。
    猜你喜欢
    • 2011-01-19
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 2011-06-08
    • 2021-08-04
    • 2013-09-21
    • 2011-12-15
    • 2019-02-10
    相关资源
    最近更新 更多