2009-03-23 7 views
101

У меня есть сайт (Flash), локализованный на десятке языков, и я хочу автоматически определять значение по умолчанию в зависимости от настроек браузера пользователя, чтобы минимизировать шаги для доступа к контенту ,Лучший способ определить пользовательский язык в браузере

FYI, я не могу использовать серверные сценарии из-за ограничений прокси-сервера, поэтому, я думаю, JavaScript или ActionScript были бы подходящими для решения проблемы.

Вопросы:

  1. Что было бы лучшим способом 'угадать' локали пользователя?

  2. Существуют ли какие-либо существующие простые классы/функции, которые могли бы помочь мне (без сложных пакетов локализации)? Специально сломать все возможные языки на меньшее число (переводы, которые у меня есть) на умном пути.

  3. В какой момент я могу доверять такому решению?

  4. Любые другие обходные пути или предложения?

+0

единственный способ браузер может обмениваться метаданными о своем пользователе, а запрос - через URL-адреса и заголовки. Захватите Firefox и загляните в заголовки, отправляемые при запросе. Его довольно интересно исследовать типичные заголовки запросов и ответов. –

ответ

115

Правильный способ - посмотреть заголовок HTTP Accept-Language, отправленный на сервер. Он содержит упорядоченный, взвешенный список языков, который пользователь настроил для своего браузера.

К сожалению, этот заголовок недоступен для чтения внутри JavaScript; все, что вы получаете, это navigator.language, в котором рассказывается, какая локализованная версия веб-браузера была установлена. Это не обязательно то же самое, что и предпочтительный язык (ы) пользователя.В IE вы вместо этого получаете systemLanguage (OS установленный язык), browserLanguage (то же, что и language), и userLanguage (пользовательская область ОС), которые все одинаково бесполезны.

Если бы мне пришлось выбирать между этими свойствами, я бы понюхать для userLanguage первого, отступая к language и только после этого (если таковые не соответствуют ни одному из доступных языков), глядя на browserLanguage и, наконец, systemLanguage.

Если вы можете поставить на стороне сервера скрипт где-то в сети, который просто читает заголовок Accept-Language и выплевывает его обратно в файл JavaScript со значением заголовка в строке, например .:

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

Затем вы можете включить скрипт < src>, указав на эту внешнюю службу в HTML, и используйте JavaScript для анализа заголовка языка. Однако я не знаю какого-либо существующего библиотечного кода, так как разбор Accept-Language почти всегда выполняется на стороне сервера.

Независимо от того, что вы в конечном итоге делаете, вам обязательно нужно переопределить пользователя, потому что он всегда будет ошибочным для некоторых людей. Часто проще всего установить языковой параметр в URL-адрес (например, http: //www.example.com/en/site vs http: //www.example.com/de/site) и позволить пользователю щелкнуть связей между ними. Иногда вам нужен один URL-адрес для обеих языковых версий, и в этом случае вам нужно сохранить этот параметр в файлах cookie, но это может смутить пользовательские агенты без поддержки файлов cookie и поисковых систем.

+0

Спасибо! Все это имеет большой смысл. –

31

This article предлагает следующие свойства навигатора объекта браузера:

  • navigator.language (Netscape - браузер Локализация)
  • navigator.browserLanguage (IE-Specific - браузер Локализованные Language)
  • navigator.systemLanguage (IE-Specific - ОС Windows - локализованный язык)
  • navi gator.userLanguage

Сверните эти функции в javascript, и вы должны уметь правильно выбирать язык в большинстве случаев. Обязательно деградируйте изящно, так что у вас есть div, содержащий ваши ссылки на выбор языка, так что, если нет javascript или метод не работает, пользователь все равно может решить. Если он работает, просто скройте div.

Единственная проблема с выполнением этого на стороне клиента заключается в том, что либо вы подаете все языки клиенту, либо вам нужно подождать, пока скрипт запустится и не обнаружит язык, прежде чем запрашивать правильную версию. Возможно, обслуживание самой популярной языковой версии в качестве дефолта будет раздражать наименьшее количество людей.

Редактировать: я бы предпочел предложение певца Ивана, но всегда должен менять язык позже; не все предпочитают язык, на который их браузер по умолчанию.

+0

Спасибо Фил за ваши предложения. Что касается статьи, ей 6 лет ... не уверен, что мы можем положиться на нее? –

+1

Я подозреваю, что современные браузеры поддерживают navigator.language. Мой браузер (FF3 на Ubuntu 8.10) сообщает «en-GB». Если кто-то все еще использует IE6 - около 20% людей - тогда это стоит того. IE6 появился 8 лет назад. –

+0

IE 8 не поддерживает navigator.language. Возможно, IE 9 будет? – spig

-4

Для Flash, у вас есть flash.system.Capabilities.language — рассмотреть OS language detection к догадка approprieate локаль.

31

В Chrome и Firefox 32+ navigator.languages ​​содержит массив локалей в порядке предпочтений пользователя и является более точным, чем navigator.language, однако, чтобы сделать его обратно совместимым (протестированный Chrome/IE/Firefox/Safari), а затем использовать это:

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

Это не работает для IE9 и IE10. Для них вам нужно изучить navigator.browserLanguage. – user393274

+0

OneLiner: 'функция getLang() {return (navigator.language || navigator.languages ​​[0]); } ' – JorgeGarza

+3

@ChStark Не должно быть' return navigator.languages ​​[0] || navigator.language; '? –

Смежные вопросы