Лучший способ определить локаль пользователя в браузере - PullRequest
153 голосов
/ 23 марта 2009

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

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

Вопросы:

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

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

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

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

Ответы [ 6 ]

163 голосов
/ 23 марта 2009

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

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

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

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

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

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

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

63 голосов
/ 30 июня 2015

В 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;
}
39 голосов
/ 23 марта 2009

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

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

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

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

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

13 голосов
/ 31 августа 2018

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

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';
3 голосов
/ 22 мая 2018

Я провел небольшое исследование по этому вопросу, и я кратко изложил свои выводы в таблице ниже

enter image description here

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

0 голосов
/ 05 июня 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...