Как узнать язык браузера если navigator language определяет только предпочитаемый язык
У меня есть веб-сайт (Flash), локализованный на дюжину языков, и я хочу автоматически определить значение по умолчанию в зависимости от настроек браузера пользователя, чтобы минимизировать количество шагов для доступа к контенту.
К вашему сведению, я не могу использовать серверные сценарии из-за ограничений прокси, поэтому я думаю, что для решения проблемы подойдет JavaScript или ActionScript.
Вопросы:
Какой лучший способ «угадать» локаль пользователя?
Существуют ли какие-либо простые классы / функции, которые могут мне помочь (без сложных пакетов локализации)? Специально, чтобы разбить все возможные языки на меньшее количество (у меня есть переводы) умным способом.
До какой степени я могу доверять такому решению?
Любые другие обходные пути или предложения?
К сожалению, этот заголовок недоступен для чтения внутри JavaScript; все, что вы получите, это то navigator.language , что говорит вам, какая локализованная версия веб-браузера была установлена. Это не обязательно то же самое, что предпочтительный язык (и) пользователя. В IE вместо этого вы получаете systemLanguage (язык установленной ОС), browserLanguage (так же, как language ) и userLanguage (настраиваемый пользователем регион ОС), которые все также бесполезны.
Если бы мне пришлось выбирать между этими свойствами, я бы userLanguage сначала понюхал , а затем вернулся к ( language и только после этого (если они не соответствуют ни одному из доступных языков) взгляду browserLanguage и, наконец, systemLanguage .
Если вы можете поместить серверный скрипт где-нибудь еще в сети, который просто читает заголовок Accept-Language и выплевывает его обратно в виде файла JavaScript со значением заголовка в строке, например:
тогда вы можете включить <script src>, указывающий на эту внешнюю службу в HTML, и использовать JavaScript для анализа заголовка языка. Однако я не знаю ни одного существующего библиотечного кода для этого, поскольку синтаксический анализ Accept-Language почти всегда выполняется на стороне сервера.
Я пытался определить предпочтения языка браузера с помощью JavaScript.
если я установил язык браузера в IE в Tools>Internet Options>General>Languages , Как я могу прочитать это значение с помощью JavaScript?
та же проблема для Firefox. Я не могу обнаружить настройку для tools>options>content>languages С помощью navigator.language .
я протестировал с navigator.browserLanguage и navigator.systemLanguage но ни один не возвращает значение для первой настройки ( Tools>InternetOptions>General>Languages )
нашел ссылке который подробно обсуждает это, но вопрос остается без ответа : (
Я думаю, что основная проблема здесь в том, что настройки браузера фактически не влияют на navigator.language свойство, полученное с помощью javascript.
(Примечание: это хак только для использования, если у вас нет задней части доступны, которые могут сделать это для вас. В общем, вы не должны звонить сторонним файлам javascript, размещенным на ваших страницах, если у вас нет очень высокого уровня доверия к хосту.)
Я намерен оставить его там навсегда, поэтому не стесняйтесь использовать его в своем код.
вот пример кода (в jQuery) для того, как вы можете его использовать
надеюсь, кто-то найдет это полезным.
Edit 2: по запросу вот код, который работает на AppEngine (супер тривиальный действительно):
navigator.language Это FireFox и все другие браузеры.
некоторый код языка: 'it' = Италия, 'en-US' = английский, и т. д.
как указал rcoup и В WebMacheter в комментариях ниже этот обходной путь не позволит вам различать английские диалекты, когда пользователи просматривают веб-сайт в браузерах, отличных от IE.
window.navigator.language (Chrome/FF/Safari) всегда возвращает язык браузера, а не предпочтительный язык браузера, но: "это довольно распространено для носителей английского языка (gb, au, nz и т. д.), Чтобы иметь en-us версию Firefox/Chrome/Safari.- Отсюда! .. --5--> вернет en-US даже если предпочитаемый пользователем язык en-GB .
обновление 2014 год.
теперь есть способ получить Accept-Languages в Firefox и Chrome с помощью навигатор.языки (работает в Chrome >= 32 и Firefox >= 32)
и навигатор.язык в Firefox эти годы отражает наиболее предпочтительный язык контента, а не язык пользовательского интерфейса. Но поскольку это понятие еще не поддерживается другими браузерами, это не очень полезно.
Итак, чтобы получить наиболее предпочтительное содержание язык, когда это возможно, и использовать язык пользовательского интерфейса в качестве резервного:
я наткнулся на этот кусок кода, чтобы определить язык браузера в угловой модуль перевода, который вы можете найти источник здесь. Я немного изменил код, заменив угловые.параметры isarray с массива.isArray, чтобы сделать его независимым от угловой библиотеки.
Мне нужен был только основной компонент для моих нужд, но вы можете легко использовать полную строку. Работает с последними Chrome, Firefox, Safari и IE10+.
нет достойного способа получить эту настройку, по крайней мере, не что-то независимое от браузера.
window.navigator.language для firefox/opera / safari
Если вы используете С помощью jQuery.плагин с названием i18n, вы можете использовать:
Я не могу найти ни одной ссылки, в которой говорится, что это возможно без участия serverside.
в Microsoft Internet Explorer 4.0 и ранее свойство browserLanguage отражает язык установленных пользовательский интерфейс браузера. Например, если вы устанавливаете японскую версию Windows Internet Explorer на Английская операционная система, browserLanguage будет ja.
в Internet Explorer 5 и выше, однако свойство browserLanguage отражает язык операционной система независимо от установленного языковая версия Internet Explorer. Однако, если Microsoft Windows 2000 Установленная версия мультиязычный , этот свойство browserLanguage указывает язык, заданный в операционной текущие меню и диалоговые окна системы, как найдено в региональных вариантах панель управления. Например, если вы установить японскую версию интернета Explorer 5 на английском языке (United Королевство) операционная система, browserLanguage будет en-gb. Если вы установка многоязычного языка Windows 2000 версия и установить язык меню и диалоги на французский язык, browserLanguage будет fr, даже если у вас есть Японская версия обозреватель Internet Explorer.
Примечание это свойство не указывает язык или языки, установленные пользователь в языковых настройках, расположенных в диалоговом окне Свойства обозревателя.
кроме того, это выглядит как browserLanguage осуждается причиной ИЕ8 не перечислить
Если вы разрабатываете приложение / расширение Chrome, используйте chrome.API с названием i18n.
DanSingerman имеет очень хорошее решение для этого вопроса.
вот очень простой узел.JS-сервер, который должен быть совместим с плагином jQuery dansingermans.
Это еще зависит от сервера, или более конкретно, API MediaWiki. Причина, по которой я показываю это, заключается в том, что это может служить хорошим примером получения всей полезной информации о языке пользователя: языке браузера, языке принятия, геолокации (с получением информации о стране/языке из CLDR) и, конечно же, собственных предпочтениях сайта пользователя.
Если вам нужно только поддерживать некоторые современные браузеры, то теперь вы можете использовать:
который возвращает массив языковых предпочтений пользователя в порядке, указанном пользователем.
на данный момент (сентябрь 2014) это работает: Хром (v37), В Firefox (файле v32) и Opera (v24)
но не на: Т. е. (В11)
У меня была та же проблема, и я написал следующую интерфейсную библиотеку, которая завершает код для нескольких браузеров. Это не так много кода, но приятно не копировать и вставлять один и тот же код на нескольких веб-сайтах.
Он всегда возвращает массив, упорядоченный по предпочтениям пользователей. В Safari & IE массив всегда имеет одну длину. В FF и Chrome может быть более одного язык.
Я просто придумал это. Он сочетает в себе более новый синтаксис деструктурирования JS с несколькими стандартными операциями для извлечения языка и локали.
надеюсь, это поможет кому-то
Я использую ответ Хамида некоторое время, но он в случаях, когда массив языков похож на ["en", "en-GB", "en-US", "fr-FR", "fr", "en-ZA"], он вернет "en", когда "en-GB" будет лучше соответствовать.
мое обновление (ниже) вернет первый код длинного формата, например "en-GB", в противном случае он вернет первый короткий код, например "en", в противном случае он вернет null.
ответ Дэна Сингермана имеет проблему, которую заголовок должен быть использован сразу, из-за асинхронного характера ajax jQuery. Однако с его сервером приложений google я написал следующее, Так что заголовок устанавливается как часть начальной настройки и может использоваться позже.
прежде всего, извините за мой английский. Я хотел бы поделиться мой код, потому что он работает и он отличается от других даны ответы. В этом примере, если вы говорите по-французски (Франция, Бельгия или другой французский язык), вы перенаправляетесь на французскую страницу, в противном случае на английскую страницу, в зависимости от конфигурации браузера :
Если вы контролируете бэкэнд и используете django, 4-строчная реализация идеи Дэна:
и на переднем конце:
(вы должны установить DEFAULT_LANG в settings.py конечно)
Если вы не хотите полагаться на внешний сервер, и у вас есть свой собственный, Вы можете использовать простой PHP-скрипт для достижения того же поведения, что и @DanSingerman answer.
languageDetector.в PHP:
и просто измените эти строки из сценария jQuery:
в вашей .cshtml-файл, надежно храните заголовок в атрибуте данных div:
тогда ваш код JavaScript может получить доступ к информации, например, с помощью JQuery:
конечно, вы можете использовать аналогичный подход с другими серверными технологиями, как другие упоминали.
для тех, кто ищет решение сервера Java
у меня был другой подход, это может помочь кому-то в будущем:
клиент хотел страницу, где вы можете поменять язык. мне нужно было отформатировать номера с помощью этой настройки (не настройки браузера / не какой-либо предопределенной настройки)
поэтому я установил начальную настройку в зависимости от настроек конфигурации (i18n)
позже в скрипте я использовал функцию, чтобы определить, какое число мне нужно
поэтому я использовал язык набора страница и в качестве запасного варианта я использовал настройки браузера.
что должно быть полезно для целей тестирования.
в зависимости от ваших клиентов вам могут не понадобиться эти настройки.
у меня есть хак, который я думаю, использует очень мало кода и вполне надежна.
поместить файлы вашего сайта в каталоге. SSL на ваш сервер и создайте символические ссылки на тот подкаталог, где хранятся ваши файлы, которые указывают ваши языки.
что-то вроде этого:
используйте свой веб-сервер для чтения HTTP_ACCEPT_LANGUAGE и перенаправления в эти "разные подкаталоги" в соответствии со значением языка, которое он предоставляет.
теперь вы можете используйте окно Javascript.местоположение.href, чтобы получить url-адрес и использовать его в условных обозначениях для надежного определения предпочтительного языка.
Во втором коде вроде понятнее, но все равно вопрос с корректной работой. В данный двух примерах требовалось определение языка, если английский, то автоматический редирект на английскую версию. У меня немного другой случай. Сайт на английском и немецком, немецкий преимущественно, потому что в Германии. Нужно чтобы английская версия включалась не только если это язык определяется у пользователя, а чтобы он включался при определении любого языка кроме немецкого. Будет ли какой-то из этих примеров в данном случае нормально работать? Пример: заходит человек говорящий только по-болгарски или французски - неважно. Автоматом должен идти редирект на английский (делать сайт на всех языках я естественно не собираюсь).
__________________Помощь в написании контрольных, курсовых и дипломных работ здесь
Определение IP пользователя в JS
подскажите, как можно определить ip пользователя в JS
Определение браузера пользователя
Подскажите, а возможно ли указать в коде чтоб если открываешь через хром то запускалось видео №1.
Определение устройства пользователя: мобильное/ПК
Как на JavaScript написать код для проверки с какого устройства зашел пользователь на сайт с.
объект navigator - это браузер
свойство navigator.language вернёт языковую версию браузера (т.е. на каком языке написано слово "Файл" в главном меню браузера)
как вы, основываясь на этом, определите родной язык пользователя?
у меня, к примеру, дома установлено 5 (пять) браузеров
из них английская версия - у трёх (MSIE, Safari, Opera)
русская - у двух (FireFox и Chrome)
я кто, по-вашему, русский или англичанин?
это же будет зависеть от того - в каком именно браузере я просматриваю страницу
в общем, не майтесь дурью и сделайте так, как делают все: на своей странице установите выбор языка пользователем и его выбор запоминайте в куках, чтобы в следующий раз показывать ему страницы сайта на ранее выбранном языке
например, как здесь в правом верхнем углу или как здесь, когда выбор языка прямо в центре
-----------------
в браузере MSIE возможно определить не только языковую версию браузера, но и выбранный по умолчанию язык системы и текущий выбранный язык.
но вы же, во-первых, не только на MSIE ориентироваться будете, так ведь
а, во-вторых, у меня по умолчанию строит EN и на RU я переключаю лишь когда что-то пишу. а просматриваю я с EN. так и кто я - русский или англичанин?
У меня есть сайт (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, но всегда буду менять язык позже; не все предпочитают язык, на который по умолчанию загружается браузер.
Комбинируя браузеры с несколькими способами, используемые для хранения пользовательского языка, вы получаете эту функцию:
И вот сексуальный однострочный:
Я немного поработал над этим, и я подвел итоги до сих пор в таблице ниже
Существует разница между предпочитаемыми пользователем языками и языком системы/браузера.
Пользователь может настроить предпочтительные языки в браузере, и они будут использоваться для navigator.language(s) и использоваться при запросе ресурсов с сервера, чтобы запрашивать контент в соответствии со списком языковых приоритетов.
Тем не менее, локаль браузера решит, как отобразить число, дату, время и валюту. Этот параметр, вероятно, является языком с самым высоким рейтингом, но нет никаких гарантий. В Mac и Linux локаль определяется системой независимо от языковых предпочтений пользователя. В Windows можно выбрать один из языков в списке предпочтений в Chrome.
Используя Intl (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl), разработчики могут переопределить/установить языковой стандарт, используемый для визуализации этих вещей, но есть элементы, которые нельзя переопределить, например, формат <input type="date"> .
Чтобы правильно извлечь этот язык, я нашел только один способ:
( Intl.NumberFormat().resolvedOptions().locale тоже работает)
Это создаст новый экземпляр NumberFormat для языкового стандарта по умолчанию, а затем снова прочитает языковой стандарт этих разрешенных опций.
Вы также можете попытаться получить язык из документа, который может быть вашим первым портом вызова, а затем использовать другие средства, так как часто люди хотят, чтобы их язык JS соответствовал языку документа.
Никакой реальный источник не является на 100% надежным, поскольку люди могут просто указать не тот язык.
Существуют библиотеки определения языка, которые могут позволить вам определить язык по содержанию.
Читайте также: