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