Лучший способ определить языковой стандарт пользователя в браузере

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

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

вопросы:

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

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

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

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

6 ответов


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

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

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

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

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

затем вы можете включить

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


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

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

в этой статье предлагает следующие Свойства браузера навигатор


Я сделал немного исследований по этому поводу, и я суммировал свои выводы до сих пор в таблице ниже

enter image description here

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


объединение нескольких способов, используемых браузерами для хранения языка пользователя, вы получаете эту функцию:

const getNavigatorLanguage = () => {
  if (navigator.languages && navigator.languages.length) {
    return navigator.languages[0];
  } else {
    return navigator.userLanguage || navigator.language || navigator.browserLanguage || 'en';
  }
}

мы сначала проверяем navigator.languages массив для его первого элемента.
Тогда мы получаем либо navigator.userLanguage или navigator.language.
Если это не удается, мы получаем navigator.browserLanguage.
Наконец, мы установили его в 'en' если все остальное не удалось.


и вот сексуальный один-лайнер:

const getNavigatorLanguage = () => (navigator.languages && navigator.languages.length) ? navigator.languages[0] : navigator.userLanguage || navigator.language || navigator.browserLanguage || 'en';

Вы сказали, что ваш сайт имеет Flash, а затем, как еще один вариант, вы можете получить язык операционной системы с flash.system.Capabilities.language- см. как определить язык ОС в браузере to Угадай локаль операционной системы.