PHP istemci yerel algılamak için basit yolu

12 Cevap php

Ben PHP kullanarak, web sitemdeki bir ziyaretçi ne ülke tespit edebilmek istiyorum.

Ben sadece bazı kelimeleri (Americans seems to believe that the word "enrolment" has 2 Ls.... crazy yanks) yazım değişen, bir güvenlik önlemi olarak ya da önemli bir şey için bu kullanmak için çalışıyorum değilim, ve belki de bir "Ülkenizi seçin" listesinde varsayılan bir seçeneği vermek unutmayın .

Gibi, bir Coğrafi Konum veritabanı kullanarak over-the-top biraz ve ben gerçekten sadece bunun için yeni bir PHP kitaplıkları yükleme hakkında muck istemiyorum, bu yüzden what's the easiest/simplest way to find what country a visitor is from?

12 Cevap

Garantili, ama çoğu tarayıcılar ABD'den eğer en-us belirten bir Accept-Language HTTP başlığını göndermeyin. Bazı eski tarayıcılar sadece onlar olsa, en söyledi. Ve tüm makineleri tercih ettikleri, hangi yerel belirtmek için doğru ayarlanmış değil. Ama iyi bir ilk tahmin.

İngilizce-İngiltere merkezli-kullanıcılar genellikle varsayılan tarayıcı konfigürasyonları neden gereken, İngilizce-İngiltere kendi sistem veya kullanıcı yerel ayarı en-gb Accept Dil başlığı gibi. (Tr-uk dedi bu bir önceki sürümü, üzgünüm, bir yazım hatası oldu.) Diğer ülkeler aynı zamanda en-za (güney afrika) gibi yerel, tr, ve, öncelikle teorik olarak, en-jp gibi kombinasyonlar da mümkündür.

Geo-IP tabanlı tahminler daha az olasıdır, ancak tercih edilen dil / yerele doğru olacaktır. Google IP adresi geolocation dayalı içerik müzakere Japonya'da veya Kore'de olduğumda beni gerçekten rahatsız ediyor, mantıklı düşünüyor ...

Çoğu tarayıcılar göndermek olacaktır ($ _SERVER) HTTP_ACCEPT_LANGUAGE başlığını kontrol edebilirsiniz.

Örnek için Zend_Locale bir göz atın, ya da belki de lib kullanmak isteyebilirsiniz.

Bazı IP comparaison without bunu yapmak için bütün bir kütüphane sahip yapabilirsiniz.

Solution #1

Bir API kullanmak, bu şekilde hiçbir şey senin tarafında gereklidir. Bu ülkeyi bildirmek bir web API:

 Example: http://api.hostip.info/get_html.php?ip=12.215.42.19
 Return : Country: UNITED STATES (US)

Solution #2

Ancak, tarayıcı ajan dilini kullanmayı düşünüyorum mı? Sen ondan ingilizce türünü bilmek mümkün olabilir.

Solution #3

Denir Bu web sitesi BlockCountry ülkeye göre IP listesi atalım. Tabii ki, engellemek istemiyorum, ama IP listesini kullanmak ve (tüm ABD IP olsun ...) bu doğru olmayabilir bunları karşılaştırmak ...

Sizin belirtilen amaç göz önüne alındığında, Accept-Language başlık IP-tabanlı geolocation daha uygun bir çözümdür. Gerçekten de, tam Accept-Language kullanım amacı bulunuyor.

Ülkenizi ve tarayıcınızın yerel almak için $ _SERVER ["HTTP_ACCEPT_LANGUAGE"] Ayrıştırma

Ya da şunları yapabilirsiniz:

http://www.maxmind.com/app/geoip_country adlı 'geoip.dat' ve geoip.inc indir

geoip.inc başlığında size (örn. ... başlatmak ve dinlenme) nasıl kullanılacağını bulacaksınız

GeolP uzatma iyi bir seçimdir.

Bu eski bir yazı olduğunu, ancak PHP bir yerel içine $ _SERVER ['HTTP_ACCEPT_LANGUAGE'] değişkeni ayrıştırmak için, 5.3.0 yana bir işlev sağlar.

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

$locale = Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);
echo $locale; // returns en_US

Ben, GeoIP uzatma kullanımı çok basit kullanılan sonra ziyaretçilerin ülkeyi tanımlamak için.

http://countries.nerd.dk servisi I IP-to-ülke haritalama için kullanmak budur. Bu gerçekten iyi çalışıyor ve DNS dayalı olarak, çok iyi önbelleğe alınır.

Eğer harici bir hizmet güvenmek istemiyorsanız da yerel kullanım için veritabanını indirebilirsiniz.

Ayrıca müşterinin zaman dilimini tespit olabilir - http://unmissabletokyo.com/country-detector.html bir örnek için bkz:

Bir şey ikinci, istediği dil görüntüleyici - Eğer hizmet edebilir ki:

$SystemLocales = explode("\n", shell_exec('locale -a'));
$BrowserLocales = explode(",",str_replace("-","_",$_SERVER["HTTP_ACCEPT_LANGUAGE"])); // brosers use en-US, Linux uses en_US
for($i=0;$i<count($BrowserLocales);$i++) {         
  list($BrowserLocales[$i])=explode(";",$BrowserLocales[$i]); //trick for "en;q=0.8"
  for($j=0;$j<count($SystemLocales);$j++) {
    if ($BrowserLocales[$i]==substr($SystemLocales[$j],0,strlen($BrowserLocales[$i]))){
      setlocale(LC_ALL, $SystemLocales[$j]);
      break 2; // found and set, so no more check is needed
    }
  }
}

Örneğin, maden sisteminin sadece hizmet vermektedir:

  • C
  • POSIX
  • pl_PL.UTF-8

ve benim tarayıcı diller: pl, en-US, tr => tek doğru yerel pl_PL.UTF-8 yani.

Hiçbir başarılı karşılaştırma bulunduğunda - hiç setlocale var.