На этот вопрос уже есть ответ:

Я пытался определить предпочтения языка браузера с помощью JavaScript.

Если я установлю язык браузера в IE в Tools>Internet Options>General>Languages Я использовал это в прошлом, и это делает хорошую работу. Это не бесплатно, но вы обязательно должны взглянуть.

Та же проблема для Firefox. Я не могу определить настройку для tools>options>content>languagesusing navigator.language Глядя на вывод

массивов navigator.userLanguage обнаруживает настройку, выполненную через Start>ControlPanel>RegionalandLanguageOptions>Regional Options.

Я тестировал с navigator.browserLanguage и navigator.systemLanguage, но ни один из них не возвращает значение для первой настройки (Tools>InternetOptions>General>Languages С чем вы столкнулись

я нашел ссылка Как я могу отправить свой объект $ scope из одного контроллера в другой, используя методы. $ emit и. $ on? & # xA ; & # xA ; function firstCtrl ($ scope) {& # xA ; $ scope. $ emit (‘someEvent’, [1, 2,3]) ; & # хА ;} & # хА ; & {** **} xA ; function secondCtrl ($ scope) {& # xA ; …

отмечено как дубликата Сэмюэл Лью Herding Code с Джеффом Этвудом Пользователи с реализацией значок javascript могут в одиночку закрыть Это должно работать для вашего случая, независимо от того, является ли параметр последним или нет. Этот вопрос уже задавался и уже имеет ответ. Если эти ответы не в полной мере отвечают на ваш вопрос,

задайте новый вопрос . Для автоматического доступа js к локальному fs необходимо создать не html-файл с js внутри, а hta-документ. Глядя на вывод

— подобный серверный скрипт navigator.language свойство, полученное с помощью JavaScript.

Я кодировал обходной путь: я выбрал скрипт google app engine в

Также Google Chrome работал в fs api, больше информации здесь: Попробуйте создать две функции: Как я могу собрать информацию о часовом поясе посетителя? Мне нужен часовой пояс, а также часы смещения по Гринвичу.

(Примечание: это это взлом только для использования, если у вас нет доступной серверной части, которая может сделать это для вас. Как правило, вам не следует звонить на сторонние файлы javascript, размещенные на ваших страницах, если вы не очень доверяете хосту.)

Я намерен оставить его там навсегда, поэтому не стесняйтесь использовать его в своем коде.

Это может помочь,

$.ajax({ 
    url: "http://ajaxhttpheaders.appspot.com", 
    dataType: 'jsonp', 
    success: function(headers) {
        language = headers['Accept-Language'];
        nowDoSomethingWithIt(language);
    }
});

ECMAscript 6 представил функции стрелок. Функции стрелок меняют поведение при раннем связывании.

Другое существенное отличие, конечно же, заключается в том, что Если вы проверите журналы консоли, вы найдете «

Редактировать 2: В соответствии с запросом приведен код, который выполняется на AppEngine (действительно, очень тривиально):

class MainPage(webapp.RequestHandler):
    def get(self):
        headers = self.request.headers
        callback = self.request.get('callback')

        if callback:
          self.response.headers['Content-Type'] = 'application/javascript'
          self.response.out.write(callback   "(")
          self.response.out.write(headers)
          self.response.out.write(")")
        else:
          self.response.headers['Content-Type'] = 'text/plain'
          self.response.out.write("I need a callback=")

application = webapp.WSGIApplication(
                                     [('/', MainPage)],
                                     debug=False)

def main():
    run_wsgi_app(application)

if __name__ == "__main__":
    main()

ES6 for..of loop https://github.com/dansingerman/app-engine-headers

var language = window.navigator.userLanguage || window.navigator.language;
alert(language); //works IE/SAFARI/CHROME/FF

window.navigator.userLanguage сообщении блога, детализирующем все различия Панель управления Windows — Региональные параметры и НЕ язык браузера, но можно предположить, что пользователь, использующий машину с настройками Window Regional, установленными во Францию, вероятно, является французским пользователем.

navigator.language Как сказал Мэтт Джонсон

Все современные браузеры имеют консоль разработчика, где вы можете выполнять произвольный JavaScript в любом случае и любой полуумный Разработчик может взглянуть на ваш JS-источник и поместить все, что ему нужно, в консоль разработчика, чтобы делать то, что он хочет. 'it' = italy, 'en-US' = английский США и т. Д.


Для чтения текста локального файла через , вы можете немного упростить его, используя ES2015: и javascript — могут сохраняться переменные между загрузками страниц по-прежнему будет возвращать

window.navigator.language Смотрите также window.navigator.language, даже если пользователь предпочитает язык en-US — Google Chrome и Mozilla Firefox en-GB Глядя на вывод

Обновление 2014 года.

и navigator.languages ​​ динамическая unixTime queryString предотвращает кэширование.

Кроме того, нужно в Firefox в эти годы отражает наиболее предпочтительный язык контента, а не язык пользовательского интерфейса. Но поскольку это понятие еще не поддерживается другими браузерами, оно не очень полезно.

Порядок итерации свойства

navigator.languages
    ? navigator.languages[0]
    : (navigator.language || navigator.userLanguage)

Я наткнулся на этот фрагмент кода для определения языка браузера в модуль углового перевода , который вы можете найти в источнике говорится, что . Я немного модифицировал код, заменив angular.isArray на Array.isArray, чтобы сделать его независимым от Angular. Метод library.

var getFirstBrowserLanguage = function () {
    var nav = window.navigator,
    browserLanguagePropertyKeys = ['language', 'browserLanguage', 'systemLanguage', 'userLanguage'],
    i,
    language;

    // support for HTML 5.1 "navigator.languages"
    if (Array.isArray(nav.languages)) {
      for (i = 0; i < nav.languages.length; i  ) {
        language = nav.languages[i];
        if (language && language.length) {
          return language;
        }
      }
    }

    // support for other well known properties in browsers
    for (i = 0; i < browserLanguagePropertyKeys.length; i  ) {
      language = nav[browserLanguagePropertyKeys[i]];
      if (language && language.length) {
        return language;
      }
    }

    return null;
  };

console.log(getFirstBrowserLanguage());
var language = navigator.languages && navigator.languages[0] || // Chrome / Firefox
               navigator.language ||   // All browsers
               navigator.userLanguage; // IE <= 10

console.log(language);

Попробуйте шаблон PWA https://github.com/StartPolymer/progressive-web-app-template

<script type="text/javascript">
var lang = window.navigator.languages ? window.navigator.languages[0] : null;
    lang = lang || window.navigator.language || window.navigator.browserLanguage || window.navigator.userLanguage;
if (lang.indexOf('-') !== -1)
    lang = lang.split('-')[0];

if (lang.indexOf('_') !== -1)
    lang = lang.split('_')[0];
</script>

. Мне нужен был только основной компонент для моих нужд, но вы можете легко использовать полную строку. Работает с последними версиями Chrome, Firefox, Safari и IE10.

Приличного способа получить этот параметр, в по крайней мере, не что-то независимое от браузера.

Но эта информация есть на сервере, поскольку она является частью заголовка HTTP-запроса (в поле Accept-Language, см. http://www.w3.org/Protocols /rfc2616/rfc2616-sec14.htmlndom****‹sec14.4 С чем вы столкнулись

Таким образом, единственный надежный способ — получить ответ с сервера. Вам понадобится что-то, что выполняется на сервере (например, .asp, .jsp, .php, CGI), и эта «вещь» может вернуть эту информацию. Хорошие примеры здесь: http://www.developershome.com/wap/detection/detection.asp?page=readHeader

navigator.userLanguage для IE

window.navigator.language для firefox / opera / safari

Я уже некоторое время использую ответ Хамида, но в тех случаях, когда массив languages ​​похож на [«en», «en-GB», «en-US», «fr-FR», «fr», «en-ZA»], он вернет «en», когда «en-GB» будет лучшим совпадением.

Мое обновление (ниже) вернет первый код в длинном формате, например «en-GB», в противном случае он вернет первый короткий код, например, «en», иначе он вернет ноль.

function getFirstBrowserLanguage() {
        var nav = window.navigator,
            browserLanguagePropertyKeys = ['language', 'browserLanguage', 'systemLanguage', 'userLanguage'],
            i,
            language,
            len,
            shortLanguage = null;

        // support for HTML 5.1 "navigator.languages"
        if (Array.isArray(nav.languages)) {
            for (i = 0; i < nav.languages.length; i  ) {
                language = nav.languages[i];
                len = language.length;
                if (!shortLanguage && len) {
                    shortLanguage = language;
                }
                if (language && len>2) {
                    return language;
                }
            }
        }

        // support for other well known properties in browsers
        for (i = 0; i < browserLanguagePropertyKeys.length; i  ) {
            language = nav[browserLanguagePropertyKeys[i]];
            len = language.length;
            if (!shortLanguage && len) {
                shortLanguage = language;
            }
            if (language && len > 2) {
                return language;
            }
        }

        return shortLanguage;
    }

console.log(getFirstBrowserLanguage());

Я не могу найти ни одной ссылки, в которой говорится, что это возможно без участия сервера.

MSDN для:

Из browserLanguage: { *} Простой пример, который позволяет CORS для всех доменов на всех маршрутах:

В Microsoft Internet Explorer 4.0 и более ранних версиях свойство browserLanguage отражает язык пользовательского интерфейса установленного браузера. Например, если вы устанавливаете японскую версию Windows Internet Explorer в операционной системе на английском языке, browserLanguage будет ja.

В Internet Explorer 5 и более поздних версиях свойство browserLanguage отражает язык операционной системы независимо от установленной языковой версии Internet Explorer. Тем не менее, если установлена ​​версия Microsoft Windows 2000 MultiLanguage, свойство browserLanguage указывает язык, установленный в текущих меню и диалоговых окнах операционной системы, как указано в разделе «Региональные параметры панели управления». Например, если вы установите японскую версию Internet Explorer 5 в операционной системе на английском (Великобритания), browserLanguage будет en-gb. Если вы установите версию для Windows 2000 MultiLanguage и установите язык меню и диалогов на французский, то browserLanguage будет французским, даже если у вас есть версия Internet Explorer на японском языке.

Разницу, которую вы могли бы увидеть, если бы у вас была другая пара функций:

будет ложным, если значение массива равно 0 или любому другому ложному значению. browserLanguage, поскольку IE8 не перечисляет его

Javascript way:

var language = window.navigator.userLanguage || window.navigator.language;//returns value like 'en-us'

плагин jQuery.i18n Я использую Если вы разрабатываете приложение / расширение Chrome, используйте

jQuery.i18n.browserLang();//returns value like '"en-US"'

chrome.i18n API Требуется принудительно установить отображаемую дату = дата сервера, не имеет значения локальные настройки (UTC). У меня была та же проблема, и я написал следующую библиотеку только для внешнего интерфейса, которая оборачивает код для нескольких браузеров. Это не так много кода, но приятно не копировать и вставлять один и тот же код на нескольких сайтах. Глядя на вывод

chrome.i18n.getAcceptLanguages(function(languages) {
  console.log(languages);
  // ["en-AU", "en", "en-US"]
});

acceptlanguages.js

Get it: с минимальным минимумом Функция добавления. Его данные ~ 1 КБ:

его использование:

<script src="acceptedlanguages.js"></script>
<script type="text/javascript">
  console.log('Accepted Languages:  '   acceptedlanguages.accepted);
</script>

Всегда возвращает массив, упорядоченный по предпочтениям пользователя. В IE Safari & Amp ; массив всегда одинарной длины. В FF и Chrome это может быть несколько языков.

Надеюсь, что это поможет кому-то

var [lang, locale] = (((navigator.userLanguage || navigator.language).replace('-', '_')).toLowerCase()).split('_');

преобразовать объекты Date в разные часовые пояса.

Не считая браузерные скрипты с жесткого диска, javascript: URI и

. Единственный надежный источник для языка находится в заголовке HTTP-запроса. вам нужен серверный скрипт для ответа на заголовок запроса или, по крайней мере, поддержку Accept-Language поле обратно к вам.

Вот очень простой сервер Node.js, который должен быть совместим с плагином DanSingermans jQuery.

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end(JSON.stringify(req.headers));
}).listen(80,'0.0.0.0');

Для чего стоит, библиотека Универсального выбора языка Викимедиа имеет ловушки для этого: https://www.mediawiki.org/wiki/Extension:UniversalLanguageSelector

Смотрите функцию getFrequentLanguageList в resources / js / ext.uls.init.js. Прямая ссылка: Https://gerrit.wikimedia.org/r/gitweb?p=mediawiki/extensions/UniversalLanguageSelector.git ; а = блоб ; е = ресурсы / JS / ext.uls.init .js ; hb = HEAD

Это все еще зависит от сервера или, более конкретно, API MediaWiki. Причина, по которой я показываю это, заключается в том, что он может послужить хорошим примером получения всей полезной информации о языке пользователя: языке браузера, Accept-Language, геолокации (с получением информации о стране / языке из CLDR) и, конечно же, Пользовательские настройки сайта.

(или, чтобы быть более понятным: {{ } — отправляет событие вниз во все дочерние области,

navigator.languages

, который возвращает массив языковых предпочтений пользователя в порядке, указанном пользователем.

На данный момент (сентябрь 2014 г. ) это работает на: Chrome (v37), Firefox (v32) и Opera (v24)

Но не на: IE (v11)

Ответ Дэна Сингермана имеет проблему, заключающуюся в том, что извлеченный заголовок должен использоваться сразу, из-за асинхронной природы jjuery ajax. Однако на его сервере приложений Google я написал следующее, так что заголовок устанавливается как часть первоначальной настройки и может быть использован позже.

<html>
<head>
<script>

    var bLocale='raw'; // can be used at any other place

    function processHeaders(headers){
        bLocale=headers['Accept-Language'];
        comma=bLocale.indexOf(',');
        if(comma>0) bLocale=bLocale.substring(0, comma);
    }

</script>

<script src="jquery-1.11.0.js"></script>

<script type="application/javascript" src="http://ajaxhttpheaders.appspot.com?callback=processHeaders"></script>

</head>
<body>

<h1 id="bLocale">Should be the browser locale here</h1>

</body>

<script>

    $("#bLocale").text(bLocale);

</script>
</html>

Прежде всего, извините за мой английский. Я хотел бы поделиться своим кодом, потому что он работает, и он отличается от других, приведенных в ответах. В этом примере, если Вы говорите по-французски (Франция, Бельгия или другой французский язык), вы перенаправлены на французскую страницу, в противном случае — на английскую страницу, в зависимости от конфигурации браузера:

<script type="text/javascript">
        $(document).ready(function () {
            var userLang = navigator.language || navigator.userLanguage;
            if (userLang.startsWith("fr")) {
                    window.location.href = '../fr/index.html';
                }
            else {
                    window.location.href = '../en/index.html';
                }
            });
    </script>

При этом код будет практически невозможен для понимания, и я думаю, что на этом этапе это займет больше времени. для хакера заново воспроизвести ваш код, чем на самом деле, если он переписал с нуля. Переписать и клонировать — это то, что вы не можете остановить. В конце концов, мы свободные люди!

def get_browser_lang(request):
if request.META.has_key('HTTP_ACCEPT_LANGUAGE'):
    return JsonResponse({'response': request.META['HTTP_ACCEPT_LANGUAGE']})
else:
    return JsonResponse({'response': settings.DEFAULT_LANG})

, затем в urls.py:

url(r'^browserlang/$', views.get_browser_lang, name='get_browser_lang'),

и на переднем крае:

$.get(lg('SERVER')   'browserlang/', function(data){
    var lang_code = data.response.split(',')[0].split(';')[0].split('-')[0];
});

(конечно, вы должны установить DEFAULT_LANG в settings.py)

, всех Доступ к заголовкам HTTP веб-страницы в JavaScript Хорошо Единственное, о чем я могу рассказать — это геттеры:

var req = new XMLHttpRequest();
req.open('GET', document.location, false);
req.send(null);
var headers = req.getAllResponseHeaders().toLowerCase();
var contentLanguage = headers.match( /^content-language:(.*)$/gm );
if(contentLanguage[0]) {
    return contentLanguage[0].split(":")[1].trim().toUpperCase();
}

Если вы не хотите полагаться на внешний сервер и у вас есть свой собственный, вы можете использовать простой скрипт PHP для достижения того же поведение как ответ @DanSingerman.

Код, который я использовал, можно найти здесь: :

<?php
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
echo json_encode($lang);
?>

‘s

url: "languageDetector.php",
dataType: 'json',
success: function(language) {
    nowDoSomethingWithIt(language);
}

. Это работает так же, как и раньше: мы создаем локальную переменную для функции, а затем мы создаем закрытие. Accepted-Languages ​​ из заголовка JavaScript, вот пример обходного пути, который не включает никаких асинхронных запросов.

В вашем Файл .cshtml, надежно сохраните заголовок в атрибуте данных div:

<div data-languages="@Json.Encode(HttpContext.Current.Request.UserLanguages)"></div>

Тогда ваш код JavaScript может получить доступ к информации, например, используя JQuery:

<script type="text/javascript">
$('[data-languages]').each(function () {
    var languages = $(this).data("languages");
    for (var i = 0; i < languages.length; i  ) {
        var regex = /[-;]/;
        console.log(languages[i].split(regex)[0]);
    }
});
</script>

Конечно, вы можете использовать аналогичный подход с другими серверными технологиями, как уже упоминали другие.

Для тех, кто ищет для решения Java Server

Здесь RestEasy

@GET
@Path("/preference-language")
@Consumes({"application/json", "application/xml"})
@Produces({"application/json", "application/xml"})
public Response getUserLanguagePreference(@Context HttpHeaders headers) {
    return Response.status(200)
            .entity(headers.getAcceptableLanguages().get(0))
            .build();
}

Всегда создавайте процедуры с

клиент хотел страницу, где вы может поменять языки. Мне нужно отформатировать числа с помощью этой настройки (не настройки браузера / каких-либо предопределенных настроек)

, поэтому я установил начальную настройку в зависимости от настроек конфигурации (i18n)

$clang = $this->Session->read('Config.language');
echo "<script type='text/javascript'>var clang = '$clang'</script>";

позже в скрипте я использовал функцию, чтобы определить, какое форматирование чисел мне нужно

function getLangsettings(){
  if(typeof clang === 'undefined') clang = navigator.language;
  //console.log(clang);
  switch(clang){
    case 'de':
    case 'de-de':
        return {precision : 2, thousand : ".", decimal : ","}
    case 'en':
    case 'en-gb':
    default:
        return {precision : 2, thousand : ",", decimal : "."}
  }
}

, поэтому я использовал заданный язык страницы и в качестве запасного варианта я использовал настройки браузера.

, который также должен быть полезен для тестирования.

в зависимости от ваших клиентов вам могут не понадобиться эти настройки.

У меня есть хак, который, я думаю, использует очень мало кода и довольно надежен.

Поместите файлы вашего сайта в подкаталог. SSL на ваш сервер и создайте символические ссылки на тот подкаталог, где хранятся ваши файлы с указанием ваших языков.

зависящее от реализации поведение

ln -s /var/www/yourhtml /var/www/en
ln -s /var/www/yourhtml /var/www/sp
ln -s /var/www/yourhtml /var/www/it

Используйте свой веб-сервер, чтобы прочитать HTTP_ACCEPT_LANGUAGE и перенаправить в эти «разные подкаталоги» в соответствии с языковым значением, которое он предоставляет.

Теперь вы можете использовать window.location.href в Javascript, чтобы получить ваш URL и использовать его в условных выражениях, чтобы надежно идентифицировать предпочтительный язык.

url_string = window.location.href;
if (url_string = "http://yoursite.com/it/index.html") {
    document.getElementById("page-wrapper").className = "italian";
}