2012-06-11 58 views
10

मुझे उपयोगकर्ताओं के देश का पता लगाने की आवश्यकता है, लेकिन मैं आईपी या आंतरिक डेटाबेस पर आधारित स्थान प्राप्त करने के लिए बाहरी सेवा से पूरी कॉल से बचने की कोशिश कर रहा हूं। मुझे यह सेवा वास्तव में उत्तरदायी बनाने की ज़रूरत है और किसी बाहरी सेवा से पूछने में लगभग आधे सेकेंड लगते हैं, इसलिए मैं इससे बचने की कोशिश कर रहा हूं। इस दृष्टिकोण के लिए डीबी को भी कोई कॉल महंगा होगा। मुझे पेज से 20ms से कम में जवाब देने की आवश्यकता है।देश का पता लगाने के लिए accept_language की शुद्धता

मैं Accept_language शीर्ष पर आधारित देश लोकेल प्राप्त करने के बारे में सोच रहा हूं।

मेरा प्रश्न है। क्या कोई जानता है कि यह कितना सटीक हो सकता है? मुझे पता है कि देश हमेशा मौजूद नहीं होता है या उपयोगकर्ता डिफ़ॉल्ट भाषा बदल सकते हैं या अपने कंप्यूटर के साथ एक अलग देश पर उपस्थित हो सकते हैं।

क्या किसी के पास पिछले अनुभव था या क्या कोई दस्तावेज है (मुझे एक गुगलिंग या डब्ल्यू 3 पृष्ठ नहीं मिला) जो इस दृष्टिकोण का उपयोग करके सटीकता या त्रुटि का प्रतिशत निर्दिष्ट करता है?

+4

भाषा ⇏ देश। पढ़ें [स्थानीय सेटिंग के लिए स्वीकार्य भाषा] [http://www.w3.org/International/questions/qa-accept-lang-locales)। – Gumbo

+0

पहले से ही इसे पढ़ा है। मैं लोकेल के रूप में स्वीकृति-भाषा विधि की% सटीकता मांग रहा हूं। यह मतलब नहीं है कि हमेशा काम करेगा। – Martin

उत्तर

8
  • यह सेटिंग के आधार पर उन देश का पता लगा रहा सिर्फ एक बुरा और बेवकूफ विचार है। मैं जर्मनी से हूं और मैं बहुत से लोगों को जानता हूं जो जर्मन या दूसरी भाषा में अपने ब्राउज़र/मोबाइल फोन या ओएस का उपयोग करते हैं। कुछ डिलीवरी सेवाएं हैं जो मुझे पता है जो ब्राउज़र द्वारा प्रेषित भाषा की जांच करते हैं और यदि यह जर्मन नहीं है तो काम नहीं करते हैं। मान लीजिए जहां मैं कभी भी आदेश नहीं देता हूं।
  • सरल उनके आईपी द्वारा भाषा का पता लगाएं। वहां कुछ (यहां तक ​​कि मुफ़्त) सेवाएं उपलब्ध हैं जो आईपी को देश में परिवर्तित कर देगी।
    उदाहरण के लिए: http://www.maxmind.com/app/geolite। उनके पास एक वेब एपीआई है, एक सर्वर जिसे आप इंस्टॉल कर सकते हैं या बस पूरे डेटाबेस को पकड़ सकते हैं और इसे अपने आप कार्यान्वित कर सकते हैं। इसके अलावा, विभिन्न वेब सर्वरों के लिए बहुत सारे मॉड्यूल/हेल्पर्स हैं, जिन्हें किसी भी व्यापक कोडिंग की आवश्यकता नहीं होगी। (देखें: अपाचे के लिए http://www.maxmind.com/app/mod_geoip, यह विज़िटर के देश को HTTP शीर्षलेख के रूप में एम्बेड करता है।)
    डीबी परिणाम कैश किए गए हैं और आपके लिए आवश्यक तेज़ होना चाहिए। 20ms बहुत तेज है, अगर आपको लगता है कि संकुल के लिए आपके सर्वर पर पहुंचने के लिए हर समय बर्बाद हो जाता है और फिर पूरी पीठ ;-)
+2

ब्राउज़र भाषा का उपयोग करना बेहद सरल कार्यान्वयन है, कोई लागत नहीं है, और नियमित अपडेट की आवश्यकता नहीं है। आईपी ​​डिटेक्शन पूरी तरह से बंद हो सकता है, खासतौर पर "लाइट" मैक्समिंड डेटाबेस को उद्देश्य पर गलत बना दिया जाता है, इसलिए जब वे बंद होते हैं, तो आप भाग्यशाली होते हैं यदि यह उसी महाद्वीप पर रहता है। रूस में कई जर्मन मोबाइल आईपी पंजीकृत हैं। ;-) मैंने पाया कि यह पृष्ठ कुछ कठिन आंकड़ों की तलाश में है क्योंकि मुझे लगता है कि ब्राउजर भाषा का देश हिस्सा फॉर्मों में पूर्व निर्धारित देशों जैसी चीजों के लिए काफी अच्छा काम कर सकता है, जहां उपयोगकर्ता अभी भी त्रुटियों को सही कर सकता है। – Someone

2

मैं केवल आपको स्थानीय डीबी का उपयोग करने की सलाह दे सकता हूं। मैंने 5 या अधिक वर्षों से निम्नलिखित मुफ्त डेटाबेस का उपयोग किया है। बस ज़िप डाउनलोड करें। शायद आपको अपने डीबी लोड करने से पहले सीवीएस को mysql डेटा में बदलने की आवश्यकता होगी लेकिन यह करना आसान है।

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

यह नियमित रूप से अद्यतन किया जाता है। और यह किसी भी सर्वर/ब्राउज़र विन्यास से अधिक सटीक है।

http://ip-to-country.webhosting.info/node/view/118 में इसका उपयोग करने के लिए एक PHP आधारित मार्गदर्शिका। यह बहुत आसान है!

EDIT: ठीक है, मैंने अभी देखा (अंतिम बार 14 दिसंबर 2010 को अपडेट किया गया)। आप पर निर्भर है ...

+0

आप सही हैं कि यह एक बेहतर दृष्टिकोण है। फिर भी मैं एक डीबी को कॉल से बचने के लिए सोच रहा था। इसके लिए अधिक हार्डवेयर और इतनी अधिक लागत की आवश्यकता होगी कि मैं इससे बचने की कोशिश कर रहा हूं क्योंकि यह बहुत अधिक यातायात (कई लाख/दिन) है। – Martin

+0

भारी ट्रैफिक आवश्यक एचडब्ल्यू का हकदार है, मुझे लगता है ... –

0

उपयोगकर्ता @TheHippo पूरी तरह से सही है। Accept-Language का उपयोग करना HTTP जानकारी उपयोगकर्ता के देश को प्राप्त करने के लिए वास्तव में अविश्वसनीय है। हालांकि, इसमें गति जैसे छोटे फायदे हैं, क्योंकि यह आईपी से देश को ट्रैक करने के लिए बाहरी सेवाओं पर निर्भर नहीं है। आप इसे बैकएंड सेवा के रूप में उपयोग करने का प्रयास कर सकते हैं, जब geoIP-type सेवाएं अनुपलब्ध हों या जब वे आपको उस देश के साथ प्रदान करें जिसमें आपकी साइट प्रस्तुत नहीं करती है या उपयोगकर्ता सेवा नहीं करते हैं।

मैं इस फ़ंक्शन का बैकएंड सेवा के रूप में उपयोग करता हूं, जब भू-आईपी-प्रकार सेवाओं का नतीजा संतुष्ट नहीं होता है। इस उद्देश्य के लिए documentation भी देखें।

//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"));