2012-11-27 47 views
4

我需要通過使用PHP的IP地址獲取訪問我的網站的用戶的語言。我該怎麼做,有任何API可以做到這一點,請告知如何通過使用php的ip地址獲取用戶語言?

+0

可能的重複:http://stackoverflow.com/questions/3650006/get-country-of-ip-address-with-php – George

+0

我不同意@ F4r-20,這是要求用戶的語言,而不是國家。 –

+0

這就是說,@sathyan,這可能是你必須猜測的東西,因爲我可以有一個澳大利亞IP地址,但只說西班牙語(作爲一個例子)。 –

回答

5

您可以使用任何geoIP模塊。它允許你通過IP檢測國家。但這不是很正確的方法。例如我現在在泰國(我有泰國知識產權),但我的語言是俄語:)

當谷歌以泰語顯示我的網頁時,這不是很好。

對於檢測語言,您可以使用瀏覽器中的標題。首選語言列在此標題中。

+0

感謝您的評論 – sathyan

+3

這是關於accept語言頭文件的討論信息。 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html這裏是一種關於它的FAQ http://www.w3.org/International/questions/qa-accept-lang-locales –

1

雖然您可以對IP地址進行查找以瞭解一般物理位置,但物理位置可能與您查找IP地址的人的語言無關。

例如,當IP位置可能是美國的紐約地區時,因爲他們正在訪問該地區,所以該人可以說普通話作爲他們的主要語言。

這裏,你可以使用IP地址查找http://ipinfodb.com/ip_location_api.php

下面是可能會有所幫助,以及一個計算器討論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,提供了一些關於這個問題的信息。

5

使用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; 
    } 
} 
+0

這樣做不是很簡單嗎?它看起來很可怕! – Ben

+3

它不必看起來不錯......將它包裹在一個功能中,如果它傷害了你的眼睛,不要再看它。 – user3097651

0
 
    function ipToCountry($ip) 
    { 
    $info = file_get_contents("http://who.is/whois-ip/ip-address/$ip"); 
    list($a, $b) = explode('COUNTRY: ', strtoupper($info)); 
    return substr(trim($b),0,2); 
    } 

    function geLangCode() 
    { 
    $countryCode = library::ipToCountry($_SERVER['REMOTE_ADDR']); 
    return $yourQuery 
    } 
+0

您確定返回該國的語言代碼? –

+0

是的,我確定,你可以試試 – Amol

0

你可以試試我的API,https://ipinfo.io。它返回JSON在默認情況下,與一羣不同領域:

$ curl ipinfo.io 
{ 
    "ip": "24.6.61.239", 
    "hostname": "c-24-6-61-239.hsd1.ca.comcast.net", 
    "city": "Mountain View", 
    "region": "California", 
    "country": "US", 
    "loc": "37.3845,-122.0881", 
    "org": "AS7922 Comcast Cable Communications, LLC", 
    "postal": "94040" 
} 

詳情請參閱https://ipinfo.io/developers

如果您要這樣做來檢測語言,您最好查看Accept-Language標題,但這是根據用戶的偏好設置的,而不是根據用戶的當前位置猜測他們可能說的語言。