2009-03-23 34 views
101

Tôi có một trang web (Flash) được bản địa hóa thành hàng chục ngôn ngữ và tôi muốn tự động xác định giá trị mặc định tùy thuộc vào cài đặt trình duyệt của người dùng để giảm thiểu các bước truy cập nội dung .Cách tốt nhất để xác định miền địa phương của người dùng trong trình duyệt

FYI, tôi không thể sử dụng máy chủ-tập lệnh do hạn chế proxy, vì vậy tôi đoán JavaScript hoặc ActionScript sẽ phù hợp để giải quyết vấn đề.

Câu hỏi:

  1. Điều gì sẽ là phương pháp tốt nhất để 'đoán' locale của người dùng?

  2. Có bất kỳ lớp/chức năng đơn giản nào có thể giúp tôi (không có gói nội địa hóa phức tạp) không? Đặc biệt để chia nhỏ tất cả các ngôn ngữ có thể thành một số nhỏ hơn (bản dịch tôi có) một cách thông minh.

  3. Tôi có thể tin tưởng giải pháp đó vào điểm nào?

  4. Bất kỳ cách giải quyết hoặc đề xuất nào khác?

+0

cách duy nhất một trình duyệt có thể chia sẻ dữ liệu meta về người dùng của nó và yêu cầu là thông qua URL và tiêu đề. Lấy Firefox và xem nhanh các tiêu đề được gửi khi yêu cầu được thực hiện. Nó khá thú vị để kiểm tra tiêu đề yêu cầu và đáp ứng tiêu biểu. –

Trả lời

115

Cách thích hợp là xem tiêu đề HTTP Accept-Language được gửi đến máy chủ. Điều này chứa danh sách ngôn ngữ được đặt hàng, có trọng số mà người dùng đã định cấu hình trình duyệt của họ muốn sử dụng.

Rất tiếc, tiêu đề này không có sẵn để đọc bên trong JavaScript; tất cả những gì bạn nhận được là navigator.language, cho bạn biết phiên bản trình duyệt web đã bản địa hóa nào đã được cài đặt. Điều này không nhất thiết phải giống như ngôn ngữ ưa thích của người dùng.Trên IE, bạn thay vào đó, hãy lấy systemLanguage (ngôn ngữ được cài đặt OS), browserLanguage (giống như language) và userLanguage (khu vực HĐH được định cấu hình người dùng), tất cả đều vô ích tương tự.

Nếu tôi phải lựa chọn giữa các thuộc tính, tôi muốn sniff cho userLanguage đầu tiên, té ngửa ra language và chỉ sau đó (nếu những không phù hợp với bất kỳ ngôn ngữ có sẵn) nhìn browserLanguage và cuối cùng systemLanguage.

Nếu bạn có thể đặt một server-side script ở một nơi khác trên mạng mà chỉ đơn giản đọc header Accept-Language và spits nó lại ra như một tập tin JavaScript với giá trị tiêu đề trong chuỗi, Eg .:

var acceptLanguage= 'en-gb,en;q=0.7,de;q=0.3'; 

thì bạn có thể bao gồm một tập lệnh < src> trỏ vào dịch vụ bên ngoài đó trong HTML và sử dụng JavaScript để phân tích cú pháp tiêu đề ngôn ngữ. Tuy nhiên, tôi không biết bất kỳ mã thư viện hiện có nào để thực hiện điều này, vì việc phân tích cú pháp Accept-Language hầu như luôn được thực hiện ở phía máy chủ.

Dù bạn kết thúc làm gì, bạn chắc chắn cần ghi đè người dùng vì sẽ luôn đoán sai đối với một số người. Thường thì dễ nhất là đặt cài đặt ngôn ngữ trong URL (ví dụ: http: //www.example.com/en/site vs http: //www.example.com/de/site) và cho phép người dùng nhấp liên kết giữa hai. Đôi khi bạn muốn một URL duy nhất cho cả hai phiên bản ngôn ngữ, trong trường hợp này bạn phải lưu cài đặt trong cookie, nhưng điều này có thể gây nhầm lẫn cho tác nhân người dùng không hỗ trợ cookie và công cụ tìm kiếm.

+0

Cảm ơn! Tất cả làm cho rất nhiều ý nghĩa. –

31

This article gợi ý các thuộc tính sau của navigator đối tượng của trình duyệt:

  • navigator.language (Netscape - Trình duyệt Localization)
  • navigator.browserLanguage (IE-cụ thể - Trình duyệt địa hoá ngôn ngữ)
  • navigator.systemLanguage (IE-Cụ thể - Hệ điều hành Windows - Ngôn ngữ được bản địa hóa)
  • navi gator.userLanguage

Cuộn chúng vào một hàm javascript và bạn sẽ có thể đoán đúng ngôn ngữ, trong hầu hết các trường hợp. Hãy chắc chắn để làm giảm gracefully, do đó, có một div chứa các liên kết lựa chọn ngôn ngữ của bạn, để nếu không có javascript hoặc phương pháp không hoạt động, người dùng vẫn có thể quyết định. Nếu nó hoạt động, chỉ cần ẩn div.

Vấn đề duy nhất khi thực hiện điều này ở phía khách là bạn phục vụ tất cả ngôn ngữ cho ứng dụng hoặc bạn phải chờ cho đến khi tập lệnh chạy và phát hiện ngôn ngữ trước khi yêu cầu phiên bản phù hợp. Có lẽ việc phục vụ phiên bản ngôn ngữ phổ biến nhất như một phiên bản mặc định sẽ kích thích những người ít nhất.

Chỉnh sửa: Tôi muốn đề xuất cookie thứ hai của Ivan, nhưng đảm bảo người dùng luôn có thể thay đổi ngôn ngữ sau này; không phải ai cũng thích ngôn ngữ mà trình duyệt của họ mặc định.

+0

Cảm ơn Phil vì những gợi ý của bạn. Về bài báo, nó đã 6 tuổi ... không chắc chúng ta có thể dựa vào nó? –

+1

Tôi nghi ngờ rằng tất cả các trình duyệt hiện đại đều hỗ trợ navigator.language. Trình duyệt của tôi (FF3 trên Ubuntu 8.10) báo cáo 'en-GB'. Nếu ai đó vẫn đang sử dụng IE6 - khoảng 20% ​​người - thì đáng để cho điều đó. IE6 đã xuất hiện cách đây 8 năm. –

+0

IE 8 không hỗ trợ navigator.language. Có lẽ IE 9 sẽ? – spig

-4

Đối với Flash bạn có flash.system.Capabilities.language — xem xét OS language detection để đoán locale approprieate.

31

Trên Chrome và Firefox 32+, navigator.languages ​​chứa một dãy các ngôn ngữ theo thứ tự ưu tiên người dùng và chính xác hơn navigator.language, tuy nhiên làm cho nó tương thích ngược (Thử nghiệm Chrome/IE/Firefox/Safari), sau đó sử dụng này:

function getLang() 
{ 
if (navigator.languages != undefined) 
return navigator.languages[0]; 
else 
return navigator.language; 
} 
+1

Tính năng này không hoạt động đối với IE9 và IE10. Đối với họ, bạn phải kiểm tra navigator.browserLanguage để thay thế. – user393274

+0

OneLiner: 'function getLang() {return (navigator.language || navigator.languages ​​[0]); } ' – JorgeGarza

+3

@ChStark Không phải là' return navigator.languages ​​[0] || navigator.language; '? –

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