2014-05-01 10 views
6

wykryć język przeglądarki tak:Przeglądarka wykrywanie języka: niespójność pomiędzy agentem użytkownika i window.navigator.language

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

Potem wysłać tę wartość do mojego serwera WWW z AJAX rozmowy.
Po sprawdzeniu wyników zobaczyłem dziwną rzecz. Na przykład agent użytkownika przeglądarki mówi, że bieżącym ustawieniem narodowym jest tr-tr, ale kiedy sprawdzam dla window.navigator.language, otrzymuję wynik jako en.

Wszystkie te przeglądarek mówi, że ich język jest 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 

powinienem rozważyć nic więcej do wykrywania języka w przeglądarce?

Mój problem polega na wykrywaniu języka przeglądarki. W przypadku programów klienckich obecny język to "tr", ale window.navigator.language oznacza "en". Czy jest to znany problem? Czy nie powinienem ufać wartości window.navigator.language? Czy powinienem przeanalizować program użytkownika dla języka?

Edytuj:
Sprawdziłem również nagłówek Accept-language dla tych żądań. Te wartości są zgodne z łańcuchem użytkownika klienta.
Tak więc, window.navigator.language mówi "en", Accept-language nagłówek to "tr-TR, en-US", ciąg agenta użytkownika ma słowo "tr-tr".

+1

Przeglądarka będzie ... – epascarello

+1

@trante już przeszedłeś to: http://stackoverflow.com/questions/1043339/javascript-for-detecting-browser-language-preference? – caramba

+0

A nawet ta konkretna odpowiedź http://stackoverflow.com/a/4079798/941240 –

Odpowiedz

2

Na podstawie tego, co powiedziałeś i niechęci do korzystania z this answer, wygląda na to, że powinieneś użyć nagłówka Accept-language lub przeanalizować ciąg userAgent (chociaż np. Firefox nie umieszcza już języka w tym łańcuchu). Ponieważ faktycznie masz dostęp do nagłówków HTTP, polecam ich używanie.

Moje podejrzenia dotyczące niespójności Państwo znaleźć jest to, że przeglądarka może być skompilowany z lokalizacji, a następnie run przez użytkownika, który chce inny locale (pod kogoś, kto po prostu pobiera domyślne en-US budowę lub ktoś, kto okresowo przełącza języki).

Będziesz musiał przetestować różne konfiguracje i zobaczyć, co działa dla Ciebie. Rozważ testowanie z różnymi różnymi Firefox locale builds i Chrome configurations. Możesz także przetestować, sondując użytkowników (użyj pliku cookie). Z biegiem czasu może nie będziesz potrzebować pliku cookie, ponieważ domyślnie uzyskasz go "dobrze" z powodu tych testów, ale zawsze będzie tu jakiś wyjątek, więc nadal dobrze jest pozwolić użytkownikowi końcowemu na zastąpienie (smart) domyślnie.

18

Jeśli chodzi o przeglądarki, istnieją dwa odpowiednie języki: język interfejsu użytkownika przeglądarki i język, w którym użytkownik preferuje przeglądanie stron internetowych. Języki te są często identyczne, ale nie muszą. Na przykład norweski użytkownik często korzysta z przeglądarki z anglojęzycznym interfejsem użytkownika, ale preferuje przeglądanie stron internetowych w języku norweskim.

Agent użytkownika zasadniczo odzwierciedla język interfejsu użytkownika przeglądarki. Zwykle ten język jest poprawiony i można go zmienić tylko przy znacznym wysiłku - takim jak ponowna instalacja przeglądarki (Chrome faktycznie pozwala na konfigurację języka przeglądarki, ale nawet tam musisz zagłębić się w preferencje przeglądarki).

Z drugiej strony preferowane języki zawartości można łatwo skonfigurować we wszystkich przeglądarkach. Użytkownik może wybrać dowolną liczbę języków i ich priorytet.Ta lista zostanie wysłana w numerze Accept-Language header i pozwoli serwerowi odpowiednio dostosować zawartość (np. Przekierować użytkownika do domyślnej wersji językowej strony).

Do tej pory jest to bardzo proste - zwykle chcesz wziąć pod uwagę Accept-Language dla swoich decyzji, a nie dla klienta użytkownika. Jedyną komplikacją jest poznanie, która z właściwości odzwierciedla odbicie właściwości window.navigator.language. Oryginalnie, window.navigator.language miał dać ci język interfejsu użytkownika przeglądarki (co oznacza, że ​​byłby zgodny z agentem użytkownika). Jednak strony internetowe używają go do podejmowania decyzji o tym, jaka wersja językowa przedstawia użytkownikowi - tak więc niektóre przeglądarki przeszły do ​​generowania jego wartości w oparciu o nagłówek Accept-Language (zazwyczaj poprzez pobranie pierwszego wpisu na liście). Jest tak z pewnością w przypadku Firefoksa 5 i nowszych wersji, a Safari 7 używa tej samej logiki (nie wiem, kiedy została wprowadzona).

uboczne Uwagi:

Powiązane problemy