2014-05-01 13 views
6

tôi phát hiện ngôn ngữ trình duyệt như thế này:trình duyệt phát hiện ngôn ngữ: mâu thuẫn giữa user agent và window.navigator.language

var language = window.navigator.userLanguage || window.navigator.language 

Sau đó, tôi gửi giá trị này đến máy chủ web của tôi với AJAX gọi.
Khi tôi kiểm tra kết quả, tôi đã thấy một điều kỳ lạ. Ví dụ: tác nhân người dùng của trình duyệt cho biết rằng địa phương hiện tại là tr-tr, nhưng khi tôi kiểm tra window.navigator.language tôi nhận được kết quả là en.

Tất cả những trình duyệt này nói rằng ngôn ngữ của họ là en:

Mozilla/5.0 (Linux; U; Android 2.2.2; tr-tr; GM FOX Build/HuaweiU8350) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1, 
Mozilla/5.0 (Linux; U; Android 2.2.2; tr-tr; LG-P503 Build/FRG83) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MMS/LG-Android-MMS-V1.0/1.2 
Mozilla/5.0 (Linux; U; Android 2.3.4; tr-tr; GT-S5670 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 
Mozilla/5.0 (Linux; U; Android 2.3.6; tr-tr; GT-S5360 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 
Mozilla/5.0 (Linux; U; Android 2.3.6; tr-tr; GT-S5830i Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 
Mozilla/5.0 (SAMSUNG; SAMSUNG-GT-S7233E/S723EJVKB1; U; Bada/1.0; tr-tr) AppleWebKit/533.1 (KHTML, like Gecko) Dolfin/2.0 Mobile WQVGA SMM-MMS/1.2.0 OPN-B 
Mozilla/5.0 (SAMSUNG; SAMSUNG-GT-S8500/S8500JVJE6; U; Bada/1.0; tr-tr) AppleWebKit/533.1 (KHTML, like Gecko) Dolfin/2.0 Mobile WVGA SMM-MMS/1.2.0 OPN-B 
Mozilla/5.0 (X11; U; Linux x86_64; tr-tr) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.114 Safari/537.36 Puffin/3.7.0.177AP 
Mozilla/5.0 (Series40; NokiaC2-02/07.63; Profile/MIDP-2.1 Configuration/CLDC-1.1) Gecko/20100401 S40OviBrowser/5.0.0.0.31 
Mozilla/5.0 (Series40; Nokia311/07.36; Profile/MIDP-2.1 Configuration/CLDC-1.1) Gecko/20100401 S40OviBrowser/2.3.0.0.54 
Mozilla/5.0 (Series40; NokiaC3-00/08.70; Profile/MIDP-2.1 Configuration/CLDC-1.1) Gecko/20100401 S40OviBrowser/2.3.0.0.49 
Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; ASU2JS; rv:11.0) like Gecko 

Tôi có nên xem xét bất cứ điều gì nhiều hơn để phát hiện ngôn ngữ trình duyệt?

Vấn đề của tôi là phát hiện ngôn ngữ trình duyệt. Đối với tác nhân người dùng, ngôn ngữ hiện tại là "tr", nhưng window.navigator.language cho "vi". Đó có phải là vấn đề đã biết không? Tôi có nên tin tưởng giá trị window.navigator.language không? Tôi có nên phân tích cú pháp tác nhân người dùng cho ngôn ngữ không?

Chỉnh sửa:
Tôi cũng đã chọn tiêu đề Chấp nhận ngôn ngữ cho các yêu cầu này. Các giá trị này phù hợp với chuỗi tác nhân người dùng của yêu cầu.
Vì vậy, window.navigator.language nói "vi", Accept-language tiêu đề là "tr-TR, en-US", chuỗi tác nhân người dùng có từ "tr-tr".

+1

Trình duyệt sẽ là ... – epascarello

+1

@trante bạn đã đi qua đáy này: http://stackoverflow.com/questions/1043339/javascript-for-detecting-browser-language-preference? – caramba

+0

Hoặc ngay cả câu trả lời cụ thể này http://stackoverflow.com/a/4079798/941240 –

Trả lời

2

Dựa trên những gì bạn đã nói và miễn cưỡng sử dụng this answer, có vẻ như bạn nên sử dụng tiêu đề Accept-language hoặc phân tích cú pháp chuỗi userAgent khác (ví dụ: Firefox không đặt ngôn ngữ đó vào chuỗi đó nữa). Bởi vì bạn thực sự có quyền truy cập vào các tiêu đề HTTP, tôi khuyên bạn nên sử dụng chúng.

nghi ngờ của tôi về mâu thuẫn bạn thấy là trình duyệt có thể biên soạn với một miền địa phương và sau đó chạy bởi một người dùng muốn một miền địa phương khác nhau (xem xét một ai đó chỉ tải các mặc định en-US xây dựng hoặc một ai đó chuyển đổi ngôn ngữ định kỳ).

Bạn sẽ phải kiểm tra các cấu hình khác nhau và xem những gì phù hợp với mình. Cân nhắc thử nghiệm với nhiều khác nhau Firefox locale buildsChrome configurations. Bạn cũng có thể kiểm tra bằng cách bỏ phiếu cho người dùng của bạn (sử dụng cookie). Theo thời gian, có lẽ bạn sẽ không cần cookie vì bạn sẽ nhận được "đúng" theo mặc định do các thử nghiệm này, nhưng sẽ luôn có ngoại lệ ở đây hoặc ở đó, vì vậy vẫn tốt để cho phép người dùng cuối ghi đè (thông minh) mặc định.

18

Theo như trình duyệt, có hai ngôn ngữ liên quan: ngôn ngữ giao diện người dùng của trình duyệt và ngôn ngữ mà người dùng muốn xem trang web. Các ngôn ngữ này thường giống nhau nhưng không nhất thiết phải như vậy. Ví dụ: người dùng Na Uy thường sẽ sử dụng trình duyệt có giao diện người dùng bằng tiếng Anh, nhưng lại thích xem các trang web bằng tiếng Na Uy.

Tác nhân người dùng thường phản ánh ngôn ngữ giao diện người dùng của trình duyệt. Thông thường, ngôn ngữ này là cố định và chỉ có thể được thay đổi với nỗ lực đáng kể - như cài đặt lại trình duyệt (Chrome thực sự cho phép định cấu hình ngôn ngữ trình duyệt nhưng ngay cả ở đó bạn phải tìm hiểu sâu về các tùy chọn trình duyệt).

Các ngôn ngữ nội dung ưu tiên, mặt khác được cấu hình dễ dàng trong tất cả các trình duyệt. Người dùng có thể chọn bất kỳ số lượng ngôn ngữ và ưu tiên của họ.Danh sách đó sẽ được gửi trong Accept-Language header và cho phép máy chủ điều chỉnh nội dung phù hợp (ví dụ: chuyển hướng người dùng đến phiên bản trang ngôn ngữ cụ thể theo mặc định).

Cho đến thời điểm này rất đơn giản - bạn thường muốn xem xét Accept-Language cho các quyết định của mình thay vì tác nhân người dùng. Biến chứng duy nhất là biết cái nào thuộc tính window.navigator.language phản ánh. Ban đầu, window.navigator.language có nghĩa là cung cấp cho bạn ngôn ngữ giao diện người dùng của trình duyệt (có nghĩa là nó sẽ khớp với tác nhân người dùng). Tuy nhiên, các trang web sử dụng nó để đưa ra quyết định về phiên bản ngôn ngữ để trình bày cho người dùng - vì vậy một số trình duyệt đã chuyển sang tạo giá trị dựa trên tiêu đề Accept-Language (thường bằng cách lấy mục nhập đầu tiên trong danh sách). Đó chắc chắn là trường hợp cho Firefox 5 trở lên và Safari 7 sử dụng cùng một logic (không biết khi nào nó được giới thiệu ở đó).

Side-ghi chú:

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