Язык браузера как посмотреть
У меня есть веб-сайт (Flash), локализованный на дюжину языков, и я хочу автоматически определить значение по умолчанию в зависимости от настроек браузера пользователя, чтобы минимизировать количество шагов для доступа к контенту.
К вашему сведению, я не могу использовать серверные сценарии из-за ограничений прокси-серверов, поэтому я думаю, что для решения проблемы подойдет JavaScript или ActionScript.
Какой лучший способ «угадать» локаль пользователя?
Существуют ли какие-либо простые классы / функции, которые могут мне помочь (без сложных пакетов локализации)? Специально, чтобы разбить все возможные языки на меньшее количество (у меня есть переводы) умным способом.
До какой степени я могу доверять такому решению?
Любые другие обходные пути или предложения?
К сожалению, этот заголовок недоступен для чтения внутри JavaScript; все, что вы получаете, это navigator.language , в котором рассказывается, что локализовано версия веб-браузера была установлена. Это не обязательно то же самое, что предпочтительный язык (и) пользователя. В IE вместо этого вы получаете systemLanguage (язык установленной ОС), browserLanguage (такой же, как language ) и userLanguage (настраиваемая пользователем область ОС), которые все также бесполезны.
Если бы мне пришлось выбирать между этими свойствами, я бы сначала обнаружил userLanguage , возвращаясь к language и только после этого (если они не соответствуют ни одному из доступных языков), глядя на > и наконец systemLanguage .
Если вы можете поместить серверный скрипт где-нибудь еще в сети, который просто читает заголовок Accept-Language и выплевывает его обратно в виде файла JavaScript со значением заголовка в строке, например:
Затем вы можете включить
Вы также можете попытаться получить язык из документа, который может быть вашим первым портом вызова, а затем использовать другие средства, так как часто люди хотят, чтобы их язык JS соответствовал языку документа.
Никакой реальный источник не обязательно на 100% надежен, так как люди могут просто говорить не на том языке.
Существуют библиотеки определения языка, которые могут позволить вам определить язык по содержанию.
В этой статье предлагаются следующие свойства браузера навигатор объект:
Сверните их в функцию javascript, и в большинстве случаев вы сможете угадать правильный язык. Обязательно снижайте грациозность, поэтому используйте div, содержащий ваши ссылки для выбора языка, чтобы, если нет javascript или метод не работал, пользователь все равно мог принять решение. Если это работает, просто скройте div.
Единственная проблема, связанная с выполнением этого на стороне клиента, заключается в том, что вы либо обслуживаете все языки для клиента, либо вам нужно подождать, пока сценарий запустится, и определить язык, прежде чем запрашивать правильную версию. Возможно, использование самой популярной языковой версии по умолчанию будет раздражать наименьшее количество людей.
Изменить: я бы предложил предложение куки Ивана, но убедитесь, что пользователь всегда может изменить язык позже; не все предпочитают язык, по умолчанию используемый их браузером.
Объединяя несколько способов, которые браузеры используют для хранения языка пользователя, вы получаете эту функцию:
А вот и сексуальный однострочник .
Существует разница между предпочтительными языками пользователя и языком системы / браузера.
Пользователь может настроить предпочтительные языки в браузере, и они будут использоваться для navigator.language(s) и использоваться при запросе ресурсов с сервера для запроса контента в соответствии со списком языковых приоритетов.
Тем не менее, локаль браузера решит, как отобразить число, дату, время и валюту. Этот параметр, вероятно, является языком с самым высоким рейтингом, но нет никаких гарантий. В Mac и Linux локаль определяется системой независимо от языковых предпочтений пользователя. На Windows это может быть выбран среди языков в списке предпочтений на Chrome.
Чтобы правильно извлечь этот язык, я нашел только один способ:
( Intl.NumberFormat().resolvedOptions().locale тоже работает)
Это создаст новый экземпляр NumberFormat для локали по умолчанию, а затем снова прочитает локаль этих разрешенных опций.
Вы сказали, что на вашем сайте есть Flash, а затем, в качестве другого варианта, вы можете получить язык операционной системы с помощью flash.system.Capabilities.language - см. Как определить язык ОС в браузере, чтобы угадать языковой стандарт операционной системы.
Сейчас работаю над сайтом, который претендует на глобальность, естественно и с мультыязычностью у него должно быть все в порядке.
О том как отображать информацию на разных языках тут речи идти не будет. Разговор пойдет о том как определить язык пользователя, и выбрать из доступных на сайте языковых версий наиболее подходящую.
Кому лень читать — посмотрите скринкаст он правда не очень получился, поэтому тут не выкладываю.
- PHP
- Фреймворк CodeIgniter (класс писался для этого фреймворка, но его можно использовать где угодно, внеся небольшие изменения)
Эта строка содержит языки пользователя, которые он предпочитает, и их приоритеты выражаются через q, ели q для языка не задано, то предполагается, что оно будет равно 1. Если постараться отобразить ее в более менее читаемом виде то она выглядит так:
Отсюда видно что я предпочитаю русский язык, а на втором месте у меня английский.
Языки написаны в двух форматах главный код языка это «ru» и «en» в моем случае, который относится к языкоывм стандартам ISO 639
И главный код языка — расширенный код языка в моем случае это «ru-ru» и «en-us» тут расширенный код языка указывает на регион использования языка у меня это United States.
Временами возникает недопонимание с тем как пометить языки, когда списки кодов ISO содержат как двухбуквенные так и трехбуквенные коды (иногда несколько трехбуквенных кодов). Сейчас все действительные коды перечислены в одном IANA реестре, который для языка принимает только одно значение из списков ISO. Если доступен двухбуквенный код ISO, то он будет один в реестре. Иначе реестр будет содержать один трехбуквенный код. Это упростит вещи.
С теорией разобрались переходим к практике:
Напишем конструктор контроллера класса:
Отсортированный по убыванию приоритета языка(значение q)
Далее создаем метод находящую наиболее подходящий язык.
Первым пареметром в нее передается язык используемый по умолчанию, вторым массив ключами которого будут языки которые есть на сайте, а значениями ссылки на него с других языков выглядит массив примерно так:
В функции урезаются языки формата главный код языка — расширенный код языка до формата главный код языка т.к. необходимость в Английской и Американской версии языка врядли возникнет, а при желании всегда можно дописать.
Результатом ее выполнения будет наиболее подходящий язык пользователя, в формате ISO 639 в качестве дефолтного языка я передал английский, и для всех языков что не находятся в массиве $langs будет возвращен en.
Всем известно, что находясь внутри браузера, нельзя извлечь достаточное количество информации о его пользователе с помощью простого JavaScript. Служебная информация, вроде имени браузерного движка, операционной системы и их версий хоть и дает общее представление о пользователе (и об аудитории в целом), но все же не является всеобъемлющей.
Для комплексного анализа пользователя используется User-ID в Universal Analytics, но с помощью независимых программных компонентов, запущенных и находящихся где-то в памяти компьютера рядом с браузером, тоже можно собирать данные о пользователе. Полученная непосредственно из памяти браузера информация позволит осуществить анализ как отдельного пользователя, так и всей аудитории. Здесь будет рассмотрено семейство браузеров на движке Webkit и на конкретном примере браузера Google Chrome.
Браузер как хранилище интересной информации
Ежедневно миллионы людей доверяют своему веб-браузеру самую сокровенную информацию: личные и банковские данные, списки избранных сайтов. Большая часть действительно «вкусной» информации (в первую очередь, для злоумышленников) скрывается как самим браузером (менеджеры паролей с шифрованием), так и веб-ресурсами, которыми люди пользуются с помощью браузера (безопасно написанный и отлаженный код, SMS-оповещения/подтверждения и т.д). Но помимо этого остаются открытыми и легкодоступными данные, вроде исходного кода страниц. Ведь именно там и находится большинство того материала, на основе которого и можно произвести комплексный анализ пользователей. И материал этот отнюдь не одного лишь технического характера.
Сами по себе браузеры (особенно на базе Chromium) построены таким образом, чтобы о пользователях «утекало» как можно меньше информации во внешний мир. Т.е разработчики всячески пытаются обезопасить людей от всевозможных, пусть даже и несущественных утечек. Google Chrome, к примеру, создает для каждой отдельной вкладки свою «песочницу» в виде отдельного процесса. О деталях можно узнать, перейдя по локальной ссылке: chrome://memory Логично предположить, что каждая такая отдельная вкладка-процесс хранит исходный код собственной страницы.
Как узнать то, что знает браузер?
Процесс браузера ничем не отличается от других процессов операционной системы, а потому и он точно так же хранит все свои данные в оперативной памяти и для него свойственны все те же принципы секторной памяти. Программные компоненты, будучи запущенными в пределах ОС, находятся на одном программном уровне с браузером. Это дает возможность прочитать память браузера, снять её дамп.
Теперь стоит понять, от чего же зависит качество сбора информации из исходных кодов открытых страниц браузера, располагающихся в памяти. Chromium — это OpenSource-проект, так что достаточно немного покопаться в его исходном коде, чтобы прояснить многие базовые аспекты.
Например, то, как устроена страница веб-документа. В классе Document, являющимся частью движка WebKit, есть вот такой код(С++):
Из этого кусочка можно судить, например, о том, что всю информацию о сущностях веб-страницы браузер хранит в объектах, являющихся иерархичными по своей структуре. В этом можно убедиться, заглянув и в каталог всех известных движку WebKit HTML-элементов.
Сочетая эту информацию со знаниями о том, как операционная система выделяет память для нового программного объекта, получается, что находиться в памяти HTML код страницы может в совершенно раздробленном виде.
Сканирование памяти и вычленение разведданных
Предположим, один из пользователей открыл у себя в браузере новую вкладку (вот такую). Что в этом простом случае, казалось бы, можно извлечь?
Например, то, что искал пользователь в поисковой системе, и что еще не было стерто браузером из памяти:
Можно узнать и некоторые персональные данные. Например, почтовый ящик конкретного пользователя:
С помощью анализатора дампа также удалось получить и исходный код страницы целиком. По всей видимости, где-то в программном коде браузера формируется строка, содержащая весь исходный код веб-страницы. Проанализировать его можно как вручную, так и с помощью всевозможных HTML-парсеров.
Часто полезную информацию получается извлечь благодаря механизму так называемого «межсайтового сопряжения». Например, когда определенные веб-ресурсы поддерживают авторизацию через аккаунт Google+, Facebook и т.д. В таком случае уже удастся получить наиболее приближённые к конкретному пользователю аналитические данные.
Предположим у целевого пользователя есть google-аккаунт и этот пользователь прокоментировал определенную сущность на сайте, который сопряжен с его аккаунтом Google. В таком случае бОльшая часть информации о google-пользователе будет инкапсулирована внутри исходного кода веб-страницы. Вот примерная часть дампа, которую можно будет вычленить из большинства страниц, интегрированных с Google:
Как минимум удалось получить ссылку на профиль пользователя, его имя и фамилию. На основе уже лишь этих данных можно развернуть широкомасштабный сбор информации о пользователе.
Что в итоге?
Часто бывает так, что крупные веб-проекты выпускают отдельные приложения для своих клиентов. Эти приложения, как правило, функционируют с браузером на одном уровне — на уровне операционной системы. Такой подход позволяет не только упрощать некоторые функции для пользователя, но и собирать о нем ценные аналитические данные, которые редко представляется возможным собрать в пределах самого браузера стандартными методами веб-аналитики. Некоторые производители клиентских приложений могут даже получать из памяти браузера глубоко личные данные, чтобы максимально «узнать» своего пользователя.
Внутри памяти браузера содержится огромное количество информации о пользователе. Вычленить базовые куски можно с помощью простого анализатора памяти процесса. Причем в этих кусках может содержаться информация широкого спектра. В конечном итоге именно эти базовые кусочки и могут лечь в основу комплексного анализа как отдельного пользователя, так и целой аудитории.
С помощью данного сервиса вы можете узнать всю информацию о своем браузере. Она определяется автоматически и выводится чуть выше. Данные определяются на основе анализа специальных заголовков, которые обозреватель передает сайту при каждом открытии страницы. Сервис находит, обрабатывает и отображает следующие сведения о вашем браузере (в том же порядке):
- Название и версию браузера.
- Включены ли coolie и javascript.
- Наличие и версию Flash плеера.
- Язык браузера.
- Текущий размер окна браузера.
- Строку User-agent.
- Список установленных плагинов.
Узнать версию браузера.
В первую очередь на этой странице можно узнать, какой браузер у вас установлен. Название и версия браузера определяется в первую очередь. В самом верху списка отображается иконка обозревателя, его версия и релиз. Сервис способен определять и анализировать информацию о следующих браузерах: Google Chrome, Mozilla Firefox, Opera, Opera Mini, Yandex browser, Internet Explorer, Safari, Netscape, Konqueror, SeaMonkey, Minefield, Maxthon, K-Meleon, Iceweasel, Camino, а также целый ряд менее известных браузеров, многочисленные варианты сборок и модификаций.
Определить включены ли cookie и javascript.
Частенько, особенно при установке нового браузера, возникает проблема с работой какого-либо сайта или приложения. В качестве одной из причин некорректного отображения час то выступают неправильный настройки браузера, в частности кук и поддежки javascript. На этой странице, в числе прочего, вы можете проверить включены ли cookie и включен ли javascript. Проверка cookie происходит с помощью двойной переадресации страницы на саму себя, поэтому ваш антивирус может сообщить об этом. Не переживайте, все нормально :)
Узнать версию флеш плеера.
В диагностическом отчете нашего сервиса содержится информация о наличии флеш плеера. Если он установлен в вашем браузере, то отображается его версия (включая номер релиза и сборки). Если плагин флеш плеера не установлен или выключен, то приложение сообщит вам об этом красным шрифтом.
Определить язык браузера онлайн.
С помощью нашего сервиса можно также определить язык браузера. Данная опция не является самой востребованной, но может пригодиться при локализации и переводе различных онлайн продуктов, во время которых часто приходится переключать язык браузера туда и обратно. Чтобы не возникало путаницы, вы можете всегда посмотреть язык вашего обозревателя на этой странице.
Текущий размер окна браузера и строка User-agent.
Дополнительно определитель выводит информацию о размере окна браузера и строчку User-agent. Эти показатели помогут верстальщикам, программистам и веб мастерам при отладке сайтов и приложений. Во-первых, при верстке нужно смотреть отображение сайта на разных устройствах. А поскольку не всегда есть возможность протестировать верстку непосредственно на девайсе, то можно просто подобрать размер окна браузера один в один с размером экрана гаджета. Строчка User-agent, в свою очередь, содержит огромное количество информации о браузере клиента. Эту информацию полезно изучать при написании различных php и javascript кроссбраузерных скриптов.
Список плагинов, установленных в вашем браузере.
В числе прочего, вы можете определить и узнать полный список плагинов вашего браузера. Они выводятся в самом низу и представляют собой список, в котором имя каждого плагина находится на новой строке. Рядом с именем в скобках указывается название .dll файла плагина. Следует отметить, что в этом списке отображаются только включенные (активные) плагины и расширения.
У меня есть сайт (Flash), локализованный на десятке языков, и я хочу автоматически определять значение по умолчанию в зависимости от настроек браузера пользователя, чтобы минимизировать шаги для доступа к контенту.
FYI, я не могу использовать серверные скрипты из-за ограничений прокси-сервера, поэтому, я думаю, JavaScript или ActionScript были бы подходящими для решения проблемы.
Вопросов:
Какой был бы лучший способ “угадать” пользовательский язык?
Существуют ли какие-либо существующие простые классы/функции, которые могут помочь мне (без сложных пакетов локализации)? Специально сломать все возможные языки на меньшее число (переводы, которые у меня есть) на умном пути.
В какой момент я могу доверять такому решению?
Любые другие обходные пути или предложения?
К сожалению, этот заголовок недоступен для чтения внутри JavaScript; все, что вы получаете, это navigator.language , в котором указывается, какая локализованная версия веб-браузера была установлена. Это не обязательно то же самое, что и пользовательский язык (ы). В IE вы вместо этого получаете systemLanguage (OS установленный язык), browserLanguage (то же, что и language ) и userLanguage (пользовательская область ОС), которые тоже бесполезны.
Если бы мне пришлось выбирать между этими свойствами, я сначала нюхал бы за userLanguage , возвращаясь к language и только после этого (если бы они не соответствовали любому доступному языку), глядя на browserLanguage и, наконец, systemLanguage .
Если вы можете поместить серверную сторону script в другое место в сети, которая просто читает заголовок Accept-Language и выплевывает его обратно как файл JavaScript со значением заголовка в строке, например.:
тогда вы можете включить < script src >, указывающий на эту внешнюю службу в HTML, и использовать JavaScript для анализа заголовка языка. Однако я не знаю какого-либо существующего библиотечного кода, так как парсинг Accept-Language почти всегда выполняется на стороне сервера.
В Chrome и Firefox 32+ navigator.languages содержит массив локалей в порядке предпочтений пользователя и более точен, чем navigator.language, однако для его обратной совместимости (протестированный Chrome/IE/Firefox/Safari), затем используйте это:
В этой статье предлагаются следующие свойства браузера навигатор:
Сверните их в функцию javascript, и вы должны угадать правильный язык в большинстве случаев. Обязательно деградируйте изящно, так что у вас есть div, содержащий ваши ссылки на выбор языка, так что, если нет javascript или метод не работает, пользователь все равно может решить. Если это работает, просто скройте div.
Единственная проблема с этим на стороне клиента заключается в том, что либо вы обслуживаете все языки для клиента, либо вам нужно дождаться, пока script запустит и не обнаружит язык, прежде чем запрашивать правильную версию. Возможно, обслуживание самой популярной языковой версии в качестве дефолта будет раздражать наименьшее количество людей.
Изменить: я бы предпочел второе предложение Ivan cookie, но всегда буду менять язык позже; не все предпочитают язык, на который по умолчанию загружается браузер.
Комбинируя браузеры с несколькими способами, используемые для хранения пользовательского языка, вы получаете эту функцию:
И вот сексуальный однострочный:
Я немного поработал над этим, и я подвел итоги до сих пор в таблице ниже
Поэтому рекомендуемое решение – написать скрипт на стороне сервера для анализа заголовка Accept-Language и передать его клиенту для настройки языка веб-сайта. Странно, почему серверу необходимо будет определить языковые предпочтения клиента, но как это происходит. Существуют и другие различные хаки, доступные для обнаружения языка, но чтение заголовка Accept-Language является рекомендуемым решением в соответствии с моим пониманием.
Существует разница между предпочитаемыми пользователем языками и языком системы/браузера.
Пользователь может настроить предпочтительные языки в браузере, и они будут использоваться для navigator.language(s) и использоваться при запросе ресурсов с сервера, чтобы запрашивать контент в соответствии со списком языковых приоритетов.
Тем не менее, локаль браузера решит, как отобразить число, дату, время и валюту. Этот параметр, вероятно, является языком с самым высоким рейтингом, но нет никаких гарантий. В Mac и Linux локаль определяется системой независимо от языковых предпочтений пользователя. В Windows можно выбрать один из языков в списке предпочтений в Chrome.
Чтобы правильно извлечь этот язык, я нашел только один способ:
( Intl.NumberFormat().resolvedOptions().locale тоже работает)
Это создаст новый экземпляр NumberFormat для языкового стандарта по умолчанию, а затем снова прочитает языковой стандарт этих разрешенных опций.
Вы также можете попытаться получить язык из документа, который может быть вашим первым портом вызова, а затем использовать другие средства, так как часто люди хотят, чтобы их язык JS соответствовал языку документа.
Никакой реальный источник не является на 100% надежным, поскольку люди могут просто указать не тот язык.
Существуют библиотеки определения языка, которые могут позволить вам определить язык по содержанию.
Вы сказали, что на вашем сайте есть Flash, а затем, в качестве другого варианта, вы можете получить язык операционной системы с помощью flash.system.Capabilities.language &— см. Как определить язык ОС в браузере, чтобы угадать локаль операционной системы.
Читайте также: