Лучший способ определить языковой стандарт пользователя в браузере
У меня есть веб-сайт (Flash), локализованный на дюжину языков, и я хочу автоматически определить значение по умолчанию в зависимости от настроек браузера пользователя, чтобы минимизировать шаги для доступа к контенту.
FYI, я не могу использовать серверные скрипты из-за ограничений прокси, поэтому я думаю, что JavaScript или ActionScript будут подходящими для решения проблемы.
вопросы:
каков был бы лучший способ "угадать" пользователя локаль?
существуют ли какие-либо существующие простые классы/функции, которые могли бы мне помочь (без сложных пакетов локализации)? Специально, чтобы разбить все возможные языки на меньшее число (переводы, которые у меня есть) на умный способ.
в какой момент я могу доверять такому решению?
любые другие обходные пути или предложения?
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;
}
Я сделал немного исследований по этому поводу, и я суммировал свои выводы до сих пор в таблице ниже
поэтому рекомендуемым решением является написание сценария на стороне сервера для анализа 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 Угадай локаль операционной системы.