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

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

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

Вопросов:

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

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

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

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

Ответ 1

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

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

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

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

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

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

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

Ответ 2

В 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;
}

Ответ 3

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

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

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

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

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

Ответ 4

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

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';

Ответ 5

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

enter image description here

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

Ответ 6

Существует разница между предпочитаемыми пользователем языками и языком системы/браузера.

Пользователь может настроить предпочтительные языки в браузере, и они будут использоваться для navigator.language(s) и использоваться при запросе ресурсов с сервера, чтобы запрашивать контент в соответствии со списком языковых приоритетов.

Тем не менее, локаль браузера решит, как отобразить число, дату, время и валюту. Этот параметр, вероятно, является языком с самым высоким рейтингом, но нет никаких гарантий. В Mac и Linux локаль определяется системой независимо от языковых предпочтений пользователя. В Windows можно выбрать один из языков в списке предпочтений в Chrome.

Используя Intl (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl), разработчики могут переопределить/установить языковой стандарт, используемый для визуализации этих вещей, но есть элементы, которые нельзя переопределить, например, формат <input type="date">.

Чтобы правильно извлечь этот язык, я нашел только один способ:

(new Intl.NumberFormat()).resolvedOptions().locale

(Intl.NumberFormat().resolvedOptions().locale тоже работает)

Это создаст новый экземпляр NumberFormat для языкового стандарта по умолчанию, а затем снова прочитает языковой стандарт этих разрешенных опций.

Ответ 7

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

HTML5:

document.querySelector('html').getAttribute('lang')

Legacy:

document.querySelector('meta[http-equiv=content-language]').getAttribute('content')

Никакой реальный источник не является на 100% надежным, поскольку люди могут просто указать не тот язык.

Существуют библиотеки определения языка, которые могут позволить вам определить язык по содержанию.