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