2012-06-11 15 views
10

Kullanıcıların ülkesini tespit etmem gerekiyor, ancak IP'ye veya dahili bir veritabanına dayalı konum elde etmek için tüm harici bir servis çağrısından kaçınmaya çalışıyorum. Bu hizmeti gerçekten duyarlı hale getirmem gerekiyor ve herhangi bir harici hizmeti sorgulamak için neredeyse yarım sanırım bu yüzden bundan kaçınmaya çalışıyorum. Ayrıca db'ye yapılan herhangi bir çağrı bu yaklaşım için maliyetli olacaktır. 20 ms'den daha kısa sürede yanıt vermek için sayfaya ihtiyacım var.Ülke algılamak için accept_language doğruluğu

Ülke yerel ayarını Accept_language başlığına göre almayı düşünüyorum.

Soruma İşte. Bunun ne kadar doğru olabileceğini bilen var mı? Bilinçli ülke her zaman mevcut değil veya kullanıcılar varsayılan dili değiştirebilir veya bilgisayarlarıyla farklı bir ülkede bulunabilirler.

Daha önce herhangi bir deneyimi oldu mu veya bu yaklaşımı kullanarak doğruluk veya hata yüzdesini belirten herhangi bir belge (ben bir googling veya w3 sayfasında bulamadım) var mı?

+4

Dil ⇏ ülke. [Yerel ayar için kullanılan Kabul Etme Dili] 'ni okuyun (http://www.w3.org/International/questions/qa-accept-lang-locales). – Gumbo

+0

Zaten oku. Yerel olarak kabul edilen dil yönteminin% doğruluğunu talep ediyorum. Her zaman işe yarayacak anlamına gelmez. – Martin

cevap

8
  • size kalmış sadece kötü ve aptal fikirdir. Ben Almanya'lıyım ve tarayıcılarını/cep telefonlarını ya da işletim sistemlerini başka bir dilde, sonra Almanca kullanan birçok insan biliyorum. Tarayıcı tarafından iletilen dili kontrol eden ve Almanca değilse bile çalışmayan birkaç yayın hizmeti var. Bir daha asla sipariş vermediğimi tahmin et.
  • Dili IP'leri ile kolayca bulun. IP'yi bir ülkeye dönüştürecek birkaç (hatta ücretsiz) hizmet var.
    Örneğin: http://www.maxmind.com/app/geolite. Bir web API'sı, yükleyebileceğiniz bir sunucu veya sadece tüm veritabanını ele geçirip kendi başınıza uygulayabilirsiniz. Ayrıca, çeşitli web sunucuları için kapsamlı kodlama gerektirmeyen birçok modül/yardımcı vardır. (Bkz. Apache için http://www.maxmind.com/app/mod_geoip, bu, ziyaretçinin ülkesini bir HTTP Üstbilgisi olarak gömer.)
    DB sonuçları önbelleğe alınmış ve ihtiyaçlarınız için yeterince hızlı olmalıdır. 20ms çok hızlıdır, eğer tüm zamanlar hakkında düşünürseniz, paketlerinizin sunucunuza ve daha sonra geri alınabilmesi için harcanır ;-)
+2

Tarayıcı dilini kullanmak son derece basit bir uygulamadır, ücretsizdir ve düzenli güncellemeler gerektirmez. IP algılama da tamamen kapalı olabilir, özellikle "light" Maxmind veritabanları amaç dışı yanlış yapılır, bu yüzden kapalı olduğunda aynı kıtada kalırsa şanslısınız. Rusya'da birçok Alman mobil IP kayıtlıdır. ;-) Bu sayfayı, tarayıcı dilinin ülke kısmının kullanıcıların hataları düzeltmeye devam edebildiği, formları önceden belirleyen ülkeler gibi şeyler için yeterince iyi çalışabileceğini düşündüğüm bazı zor istatistikleri arıyordum. – Someone

2

Sadece yerel bir DB kullanmanızı öneririm. 5 veya daha fazla yıldan beri aşağıdaki ücretsiz veritabanını kullandım. Sadece zip dosyasını indirin. Belki de DB'nizi yüklemeden önce mysql data'larına dönüştürmeniz gerekecek fakat yapılması çok kolay.

http://ip-to-country.webhosting.info/node/view/6

düzenli olarak güncellenmektedir. Ve herhangi bir sunucu/tarayıcı yapılandırmasından daha doğrudur.

http://ip-to-country.webhosting.info/node/view/118 içinde kullanmak için bir php tabanlı kılavuz. Bu çok kolay!

EDIT: Tamam, gördüm (En son 14 Aralık 2010 tarihinde güncelleştirildi). ... o dil ayarlarına göre kullanıcılar ülke algılama

+0

Haklısınız, bu daha iyi bir yaklaşım. Yine de hala bir db çağrısından kaçınmayı düşünüyordum. Bu, daha fazla donanım ve daha fazla maliyet gerektirecektir, bu da çok fazla trafik (birkaç milyonlarca gün) olduğu için bundan kaçınmaya çalışıyorum. – Martin

+0

Büyük trafik gerekli hw'yi hak ediyor, bence ... –

0

Kullanıcı @TheHippo tamamen haklıdır. Kullanıcının ülkesini almak için Accept-Language HTTP bilgisini kullanmak gerçekten güvenilmezdir. Yine de, IP gibi ülkeyi izlemek için harici servislere bağlı olmadığından, hız gibi çok az avantajı vardır. GeoIP türü hizmetler kullanılamıyorsa veya sitenizin oluşturulmadığı veya kullanıcıların sunmadığı bir ülke sağladıklarında, arka uç hizmeti olarak kullanabilirsiniz.

Ben GeoIP tipi hizmetlerinden sonuç tatmin olmayan bir arka uç hizmet olarak bu işlevi kullanın. Bu amaçla, ayrıca documentation'u da kontrol edin.

//accept_language may be for example "pt" or "pt-PT" or  
 
//"pt-PT,pt;q=0.9,en;q=0.8,en-GB;q=0.7,de-DE;q=0.6,de;q=0.5,fr-FR;q=0.4,fr;q=0.3,es;q=0.2" 
 
var getCountryFromHTTP = function (accept_language){ 
 

 
    var CC; //Country Code 
 

 
    //in some cases like "fr" or "hu" the language and the country codes are the same 
 
    if (accept_language.length === 2){ 
 
     CC = accept_language.toUpperCase(); 
 
    } 
 
    //get "PT" out of "pt-PT" 
 
    else if (accept_language.length === 5){   
 
     CC = accept_language.substring(3, 5); 
 
    } 
 
    //ex: "pt-PT,pt;q=0.9,en;q=0.8,en-GB;q=0.7,de-DE;q=0.6,de;q=0.5,fr-FR;q=0.4,fr;q=0.3,es;q=0.2" 
 
    //gets the first two capial letters that fit into 2-letter ISO country code 
 
    else if (accept_language.length > 5) { 
 
     var substr; 
 
     for (var i=0; i+2<accept_language.length; i++){ 
 
      substr = accept_language.substring(i, i+2); 
 
      if (isoCountries.hasOwnProperty(substr)){ 
 
       return substr; 
 
      }    
 
     } 
 
    } 
 

 
    if (isoCountries.hasOwnProperty(CC)){ 
 
     return CC; 
 
    } 
 

 
    return false; 
 
}; 
 

 
//2-letter ISO Country Codes 
 
var isoCountries = { 
 
    'AF' : 'Afghanistan', 
 
    'AX' : 'Aland Islands', 
 
    'AL' : 'Albania', 
 
    'DZ' : 'Algeria', 
 
    'AS' : 'American Samoa', 
 
    'AD' : 'Andorra', 
 
    'AO' : 'Angola', 
 
    'AI' : 'Anguilla', 
 
    'AQ' : 'Antarctica', 
 
    'AG' : 'Antigua And Barbuda', 
 
    'AR' : 'Argentina', 
 
    'AM' : 'Armenia', 
 
    'AW' : 'Aruba', 
 
    'AU' : 'Australia', 
 
    'AT' : 'Austria', 
 
    'AZ' : 'Azerbaijan', 
 
    'BS' : 'Bahamas', 
 
    'BH' : 'Bahrain', 
 
    'BD' : 'Bangladesh', 
 
    'BB' : 'Barbados', 
 
    'BY' : 'Belarus', 
 
    'BE' : 'Belgium', 
 
    'BZ' : 'Belize', 
 
    'BJ' : 'Benin', 
 
    'BM' : 'Bermuda', 
 
    'BT' : 'Bhutan', 
 
    'BO' : 'Bolivia', 
 
    'BA' : 'Bosnia And Herzegovina', 
 
    'BW' : 'Botswana', 
 
    'BV' : 'Bouvet Island', 
 
    'BR' : 'Brazil', 
 
    'IO' : 'British Indian Ocean Territory', 
 
    'BN' : 'Brunei Darussalam', 
 
    'BG' : 'Bulgaria', 
 
    'BF' : 'Burkina Faso', 
 
    'BI' : 'Burundi', 
 
    'KH' : 'Cambodia', 
 
    'CM' : 'Cameroon', 
 
    'CA' : 'Canada', 
 
    'CV' : 'Cape Verde', 
 
    'KY' : 'Cayman Islands', 
 
    'CF' : 'Central African Republic', 
 
    'TD' : 'Chad', 
 
    'CL' : 'Chile', 
 
    'CN' : 'China', 
 
    'CX' : 'Christmas Island', 
 
    'CC' : 'Cocos (Keeling) Islands', 
 
    'CO' : 'Colombia', 
 
    'KM' : 'Comoros', 
 
    'CG' : 'Congo', 
 
    'CD' : 'Congo, Democratic Republic', 
 
    'CK' : 'Cook Islands', 
 
    'CR' : 'Costa Rica', 
 
    'CI' : 'Cote D\'Ivoire', 
 
    'HR' : 'Croatia', 
 
    'CU' : 'Cuba', 
 
    'CY' : 'Cyprus', 
 
    'CZ' : 'Czech Republic', 
 
    'DK' : 'Denmark', 
 
    'DJ' : 'Djibouti', 
 
    'DM' : 'Dominica', 
 
    'DO' : 'Dominican Republic', 
 
    'EC' : 'Ecuador', 
 
    'EG' : 'Egypt', 
 
    'SV' : 'El Salvador', 
 
    'GQ' : 'Equatorial Guinea', 
 
    'ER' : 'Eritrea', 
 
    'EE' : 'Estonia', 
 
    'ET' : 'Ethiopia', 
 
    'FK' : 'Falkland Islands (Malvinas)', 
 
    'FO' : 'Faroe Islands', 
 
    'FJ' : 'Fiji', 
 
    'FI' : 'Finland', 
 
    'FR' : 'France', 
 
    'GF' : 'French Guiana', 
 
    'PF' : 'French Polynesia', 
 
    'TF' : 'French Southern Territories', 
 
    'GA' : 'Gabon', 
 
    'GM' : 'Gambia', 
 
    'GE' : 'Georgia', 
 
    'DE' : 'Germany', 
 
    'GH' : 'Ghana', 
 
    'GI' : 'Gibraltar', 
 
    'GR' : 'Greece', 
 
    'GL' : 'Greenland', 
 
    'GD' : 'Grenada', 
 
    'GP' : 'Guadeloupe', 
 
    'GU' : 'Guam', 
 
    'GT' : 'Guatemala', 
 
    'GG' : 'Guernsey', 
 
    'GN' : 'Guinea', 
 
    'GW' : 'Guinea-Bissau', 
 
    'GY' : 'Guyana', 
 
    'HT' : 'Haiti', 
 
    'HM' : 'Heard Island & Mcdonald Islands', 
 
    'VA' : 'Holy See (Vatican City State)', 
 
    'HN' : 'Honduras', 
 
    'HK' : 'Hong Kong', 
 
    'HU' : 'Hungary', 
 
    'IS' : 'Iceland', 
 
    'IN' : 'India', 
 
    'ID' : 'Indonesia', 
 
    'IR' : 'Iran, Islamic Republic Of', 
 
    'IQ' : 'Iraq', 
 
    'IE' : 'Ireland', 
 
    'IM' : 'Isle Of Man', 
 
    'IL' : 'Israel', 
 
    'IT' : 'Italy', 
 
    'JM' : 'Jamaica', 
 
    'JP' : 'Japan', 
 
    'JE' : 'Jersey', 
 
    'JO' : 'Jordan', 
 
    'KZ' : 'Kazakhstan', 
 
    'KE' : 'Kenya', 
 
    'KI' : 'Kiribati', 
 
    'KR' : 'Korea', 
 
    'KW' : 'Kuwait', 
 
    'KG' : 'Kyrgyzstan', 
 
    'LA' : 'Lao People\'s Democratic Republic', 
 
    'LV' : 'Latvia', 
 
    'LB' : 'Lebanon', 
 
    'LS' : 'Lesotho', 
 
    'LR' : 'Liberia', 
 
    'LY' : 'Libyan Arab Jamahiriya', 
 
    'LI' : 'Liechtenstein', 
 
    'LT' : 'Lithuania', 
 
    'LU' : 'Luxembourg', 
 
    'MO' : 'Macao', 
 
    'MK' : 'Macedonia', 
 
    'MG' : 'Madagascar', 
 
    'MW' : 'Malawi', 
 
    'MY' : 'Malaysia', 
 
    'MV' : 'Maldives', 
 
    'ML' : 'Mali', 
 
    'MT' : 'Malta', 
 
    'MH' : 'Marshall Islands', 
 
    'MQ' : 'Martinique', 
 
    'MR' : 'Mauritania', 
 
    'MU' : 'Mauritius', 
 
    'YT' : 'Mayotte', 
 
    'MX' : 'Mexico', 
 
    'FM' : 'Micronesia, Federated States Of', 
 
    'MD' : 'Moldova', 
 
    'MC' : 'Monaco', 
 
    'MN' : 'Mongolia', 
 
    'ME' : 'Montenegro', 
 
    'MS' : 'Montserrat', 
 
    'MA' : 'Morocco', 
 
    'MZ' : 'Mozambique', 
 
    'MM' : 'Myanmar', 
 
    'NA' : 'Namibia', 
 
    'NR' : 'Nauru', 
 
    'NP' : 'Nepal', 
 
    'NL' : 'Netherlands', 
 
    'AN' : 'Netherlands Antilles', 
 
    'NC' : 'New Caledonia', 
 
    'NZ' : 'New Zealand', 
 
    'NI' : 'Nicaragua', 
 
    'NE' : 'Niger', 
 
    'NG' : 'Nigeria', 
 
    'NU' : 'Niue', 
 
    'NF' : 'Norfolk Island', 
 
    'MP' : 'Northern Mariana Islands', 
 
    'NO' : 'Norway', 
 
    'OM' : 'Oman', 
 
    'PK' : 'Pakistan', 
 
    'PW' : 'Palau', 
 
    'PS' : 'Palestinian Territory, Occupied', 
 
    'PA' : 'Panama', 
 
    'PG' : 'Papua New Guinea', 
 
    'PY' : 'Paraguay', 
 
    'PE' : 'Peru', 
 
    'PH' : 'Philippines', 
 
    'PN' : 'Pitcairn', 
 
    'PL' : 'Poland', 
 
    'PT' : 'Portugal', 
 
    'PR' : 'Puerto Rico', 
 
    'QA' : 'Qatar', 
 
    'RE' : 'Reunion', 
 
    'RO' : 'Romania', 
 
    'RU' : 'Russian Federation', 
 
    'RW' : 'Rwanda', 
 
    'BL' : 'Saint Barthelemy', 
 
    'SH' : 'Saint Helena', 
 
    'KN' : 'Saint Kitts And Nevis', 
 
    'LC' : 'Saint Lucia', 
 
    'MF' : 'Saint Martin', 
 
    'PM' : 'Saint Pierre And Miquelon', 
 
    'VC' : 'Saint Vincent And Grenadines', 
 
    'WS' : 'Samoa', 
 
    'SM' : 'San Marino', 
 
    'ST' : 'Sao Tome And Principe', 
 
    'SA' : 'Saudi Arabia', 
 
    'SN' : 'Senegal', 
 
    'RS' : 'Serbia', 
 
    'SC' : 'Seychelles', 
 
    'SL' : 'Sierra Leone', 
 
    'SG' : 'Singapore', 
 
    'SK' : 'Slovakia', 
 
    'SI' : 'Slovenia', 
 
    'SB' : 'Solomon Islands', 
 
    'SO' : 'Somalia', 
 
    'ZA' : 'South Africa', 
 
    'GS' : 'South Georgia And Sandwich Isl.', 
 
    'ES' : 'Spain', 
 
    'LK' : 'Sri Lanka', 
 
    'SD' : 'Sudan', 
 
    'SR' : 'Suriname', 
 
    'SJ' : 'Svalbard And Jan Mayen', 
 
    'SZ' : 'Swaziland', 
 
    'SE' : 'Sweden', 
 
    'CH' : 'Switzerland', 
 
    'SY' : 'Syrian Arab Republic', 
 
    'TW' : 'Taiwan', 
 
    'TJ' : 'Tajikistan', 
 
    'TZ' : 'Tanzania', 
 
    'TH' : 'Thailand', 
 
    'TL' : 'Timor-Leste', 
 
    'TG' : 'Togo', 
 
    'TK' : 'Tokelau', 
 
    'TO' : 'Tonga', 
 
    'TT' : 'Trinidad And Tobago', 
 
    'TN' : 'Tunisia', 
 
    'TR' : 'Turkey', 
 
    'TM' : 'Turkmenistan', 
 
    'TC' : 'Turks And Caicos Islands', 
 
    'TV' : 'Tuvalu', 
 
    'UG' : 'Uganda', 
 
    'UA' : 'Ukraine', 
 
    'AE' : 'United Arab Emirates', 
 
    'GB' : 'United Kingdom', 
 
    'US' : 'United States', 
 
    'UM' : 'United States Outlying Islands', 
 
    'UY' : 'Uruguay', 
 
    'UZ' : 'Uzbekistan', 
 
    'VU' : 'Vanuatu', 
 
    'VE' : 'Venezuela', 
 
    'VN' : 'Viet Nam', 
 
    'VG' : 'Virgin Islands, British', 
 
    'VI' : 'Virgin Islands, U.S.', 
 
    'WF' : 'Wallis And Futuna', 
 
    'EH' : 'Western Sahara', 
 
    'YE' : 'Yemen', 
 
    'ZM' : 'Zambia', 
 
    'ZW' : 'Zimbabwe' 
 
}; 
 

 
console.log(getCountryFromHTTP("fr")); 
 
console.log(getCountryFromHTTP("pt-BR")); 
 
console.log(getCountryFromHTTP("pt-PT,pt;q=0.9,en;q=0.8,en-GB;q=0.7")); 
 
console.log(getCountryFromHTTP("pt;q=0.9,en;q=0.8,en-GB;q=0.7"));