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


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

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

вопросы:

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

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

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

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

6 132

6 ответов:

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

к сожалению, этот заголовок недоступен для чтения внутри JavaScript; все, что вы получаете, это navigator.language, который говорит вам, какая локализованная версия веб-браузера была установлена. Это не обязательно то же самое, что предпочтительный язык(ы) пользователя. На т. е. вместо вас получить 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-адрес для обеих языковых версий, и в этом случае вам нужно сохранить настройку в файлах cookie, но это может запутать агентов пользователей без поддержки файлов cookie и поисковых систем.

в Chrome и Firefox 32+, навигатор.языки содержит массив локалей в порядке предпочтения пользователя, и является более точным, чем навигатор.язык, однако, чтобы сделать его обратно совместимым (проверено 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- см. как определить язык ОС в браузере до Угадай локаль операционной системы.