2012-06-11 20 views
10

Tôi cần phát hiện quốc gia của người dùng nhưng tôi đang cố gắng tránh toàn bộ cuộc gọi đến dịch vụ bên ngoài để nhận vị trí dựa trên IP hoặc cơ sở dữ liệu nội bộ. Tôi cần phải làm cho dịch vụ này thực sự đáp ứng và phải mất gần nửa giây để truy vấn bất kỳ dịch vụ bên ngoài nào vì vậy tôi đang cố gắng tránh điều đó. Ngoài ra bất kỳ cuộc gọi đến một db sẽ là tốn kém cho phương pháp này. Tôi cần trang để trả lời trong vòng chưa đầy 20ms.Độ chính xác của accept_language để phát hiện quốc gia

Tôi đang nghĩ đến việc có được ngôn ngữ quốc gia dựa trên tiêu đề Accept_language.

Câu hỏi của tôi là. Có ai biết chính xác điều này có thể như thế nào không? Tôi biết quốc gia không phải lúc nào cũng có mặt hoặc người dùng có thể thay đổi ngôn ngữ mặc định hoặc có mặt trên một quốc gia khác với máy tính của họ.

Có ai có kinh nghiệm trước đó hoặc có tài liệu nào không (tôi không thể tìm thấy một trang hoặc trong trang w3) chỉ định phần trăm độ chính xác hoặc lỗi khi sử dụng phương pháp này?

+4

Ngôn ngữ ⇏ nước. Đọc [Accept-Language được sử dụng cho thiết lập miền địa phương] (http://www.w3.org/International/questions/qa-accept-lang-locales). – Gumbo

+0

Đã đọc nó. Tôi yêu cầu% độ chính xác của phương thức chấp nhận ngôn ngữ làm ngôn ngữ. Không ngụ ý rằng sẽ luôn luôn làm việc. – Martin

Trả lời

8
  • Phát hiện những người sử dụng nước bằng cách cài đặt ngôn ngữ nó chỉ là một xấungu ngốc ý tưởng. Tôi đến từ Đức và tôi biết rất nhiều người sử dụng trình duyệt/điện thoại di động hoặc hệ điều hành của họ bằng một ngôn ngữ khác, sau đó là tiếng Đức. Có một vài dịch vụ chuyển phát mà tôi biết kiểm tra ngôn ngữ nào được truyền bởi trình duyệt và không hoạt động nếu nó không phải là tiếng Đức. Đoán xem tôi đặt hàng không bao giờ nữa.
  • Đơn giản phát hiện ngôn ngữ theo IP của họ. Có một vài (thậm chí miễn phí) các dịch vụ sẵn có sẽ chuyển đổi IP thành một quốc gia.
    Ví dụ: http://www.maxmind.com/app/geolite. Họ có một API web, một máy chủ mà bạn có thể cài đặt hoặc chỉ cần lấy toàn bộ cơ sở dữ liệu và thực hiện nó một mình. Ngoài ra, có rất nhiều mô-đun/người trợ giúp cho các máy chủ web khác nhau, không yêu cầu bất kỳ mã hóa mở rộng nào. (Xem: http://www.maxmind.com/app/mod_geoip cho Apache, điều này sẽ nhúng quốc gia của khách truy cập dưới dạng Tiêu đề HTTP.)
    Kết quả DB được lưu trong bộ nhớ cache và phải đủ nhanh cho nhu cầu của bạn. 20ms là rất nhanh, nếu bạn suy nghĩ về tất cả các thời gian là lãng phí cho các gói để có được máy chủ của bạn và sau đó toàn bộ trở lại ;-)
+2

Sử dụng ngôn ngữ trình duyệt là triển khai cực kỳ đơn giản, không tốn chi phí và không yêu cầu cập nhật thường xuyên. Phát hiện IP cũng có thể tắt hoàn toàn, đặc biệt là các cơ sở dữ liệu Maxmind "nhẹ" được tạo ra không chính xác về mục đích, vì vậy khi chúng tắt, bạn may mắn nếu nó nằm trên cùng một lục địa. Nhiều IP di động Đức đăng ký tại Nga. ;-) Tôi tìm thấy trang này tìm kiếm một số thống kê khó khăn vì tôi cảm thấy phần quốc gia của ngôn ngữ trình duyệt có thể hoạt động tốt cho những thứ như chọn trước các quốc gia trong biểu mẫu, nơi người dùng vẫn có thể sửa lỗi. – Someone

2

Tôi chỉ có thể khuyên bạn nên sử dụng một DB địa phương. Tôi đã sử dụng cơ sở dữ liệu miễn phí sau từ 5 năm trở lên. Chỉ cần tải xuống mã zip. Có lẽ bạn sẽ cần chuyển đổi cvs thành dữ liệu mysql trước khi tải DB của bạn nhưng nó rất dễ làm.

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

Nó được cập nhật thường xuyên. Và nó chính xác hơn bất kỳ cấu hình máy chủ/trình duyệt nào.

Hướng dẫn dựa trên php để sử dụng trong http://ip-to-country.webhosting.info/node/view/118. Nó rất dễ!

EDIT: OK, tôi vừa xem (Cập nhật lần cuối vào ngày 14 tháng 12 năm 2010). Là tùy thuộc vào bạn ...

+0

Bạn đúng đó là một cách tiếp cận tốt hơn. Tuy nhiên, tôi vẫn nghĩ để tránh một cuộc gọi đến một db. Điều đó sẽ đòi hỏi phần cứng nhiều hơn và chi phí nhiều hơn đó là những gì tôi đang cố gắng để tránh điều này vì nó rất nhiều lưu lượng truy cập (vài triệu/ngày). – Martin

+0

Lưu lượng truy cập lớn xứng đáng với yêu cầu hw, tôi nghĩ rằng ... –

0

tài @TheHippo là hoàn toàn đúng đắn. Việc sử dụng thông tin HTTP Accept-Language thực sự không đáng tin cậy để có được quốc gia của người dùng. Mặc dù, nó có rất ít ưu điểm như tốc độ, vì nó không phụ thuộc vào các dịch vụ bên ngoài để theo dõi quốc gia từ IP. Bạn có thể thử sử dụng dịch vụ này làm dịch vụ phụ trợ khi dịch vụ loại GeoIP không khả dụng hoặc khi chúng cung cấp cho bạn quốc gia mà trang web của bạn không hiển thị hoặc người dùng không phân phối.

Tôi sử dụng chức năng này làm dịch vụ phụ trợ, khi kết quả từ dịch vụ kiểu geoIP không thỏa mãn. Với mục đích này, hãy kiểm tra số 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"));

Các vấn đề liên quan