Как показать элемент HTML только для определенного языка клиента? [Дубликат]

Ключевое слово static изменяет жизненный цикл метода или переменной внутри класса. Метод / переменная static создается во время загрузки класса. Метод или переменная, которая не объявлена ​​как static, создается только тогда, когда класс создается как объект, например, с помощью оператора new.

Жизненный цикл класса в широком смысле, is:

  1. записывается исходный код для класса, создающий шаблон или шаблон или штамп, которые затем могут использоваться для
  2. создать объект с помощью оператора new, используя класс, чтобы сделать экземпляр класса как фактического объекта, а затем, когда он сделан с объектом
  3. , уничтожает объект, восстанавливающий ресурсы, которые он держит, например, память во время сбора мусора.

Чтобы иметь начальную точку входа для приложения, Java приняла соглашение о том, что программа Java должна иметь класс, который содержит метод с согласованным или специальным именем. Этот специальный метод называется main(). Поскольку метод должен существовать независимо от того, был ли экземпляр класса, содержащего основной метод, метод main() должен быть объявлен с помощью модификатора static, так что, как только класс будет загружен, доступен метод main().

В результате, когда вы запускаете приложение Java с помощью командной строки, например java helloworld, происходит серия действий. Прежде всего запускается и инициализируется виртуальная машина Java. Затем файл helloworld.class, содержащий скомпилированный Java-код, загружается в виртуальную машину Java. Затем виртуальная машина Java ищет метод в классе helloworld, который называется main(String [] args). этот метод должен быть static, так что он будет существовать, даже если класс фактически не был создан как объект. Виртуальная машина Java не создает экземпляр класса, создавая объект из класса. Он просто загружает класс и запускает выполнение по методу main().

Итак, вам нужно создать экземпляр вашего класса в качестве объекта, а затем вы можете получить доступ к методам и переменным класса, у которых нет был объявлен с помощью модификатора static. После того, как ваша Java-программа началась с функции main(), вы можете использовать любые переменные или методы, которые имеют модификатор static, поскольку они существуют как часть загружаемого класса.

Однако эти переменные и методы класса, которые находятся вне метода main(), которые не имеют модификатора static, не могут использоваться до тех пор, пока экземпляр класса не будет создан как объект в рамках метода main(). После создания объекта вы можете использовать переменные и методы объекта. Попытка использовать переменные и методы класса, которые не имеют модификатора static, не проходя через объект класса, улавливается компилятором Java во время компиляции и помечена как ошибка.

import java.io.*;

class helloworld {
    int myInt;      // this is a class variable that is unique to each object
    static int myInt2;  // this is a class variable shared by all objects of this class

    static void main (String [] args) {
        // this is the main entry point for this Java application
        System.out.println ("Hello, World\n");
        myInt2 = 14;    // able to access the static int
        helloworld myWorld = new helloworld();
        myWorld.myInt = 32;   // able to access non-static through an object
    }
}
371
задан phihag 25 June 2009 в 12:50
поделиться

26 ответов

Я думаю, основная проблема здесь в том, что настройки браузера не влияют на свойство navigator.language, которое получается через javascript.

Что они влияют, это заголовок HTTP-Accept-Language, но, похоже, это значение недоступно через javascript вообще. (Вероятно, почему @anddoutoi заявляет, что не может найти ссылку для него, которая не связана с серверной стороной.)

Я закодировал обходной путь: я выбил сценарий движка приложения Google в http://ajaxhttpheaders.appspot.com , который вернет вам заголовки HTTP-запросов через JSONP.

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

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

Вот пример кода (в jQuery) для его использования

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

Надеемся, что кто-то найдет это Полезно.

Изменить: я написал небольшой плагин jQuery для github, который обертывает эту функциональность: https://github.com/dansingerman/jQuery-Browser-Language

Редактирование 2: как запрошено здесь код, который работает на AppEngine (super triv ial на самом деле):

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()

Редактировать3: Откройте исходный код кода приложения здесь: https://github.com/dansingerman/app-engine-headers

254
ответ дан DanSingerman 28 August 2018 в 04:20
поделиться
  • 1
    @msec - это проблема? Я могу опубликовать его здесь, если вы действительно думаете, что это может быть полезно. – DanSingerman 11 April 2011 в 16:48
  • 2
    @msec Я написал сценарий приложения Python по запросу. Обратите внимание: если серверная сторона доступна, это должно быть довольно простым на любом языке - эта услуга действительно должна существовать только для тех, у кого нет (или не хотят иметь) компонент на стороне сервера. – DanSingerman 12 April 2011 в 10:36
  • 3
    hi dan, этот вопрос дает 14 тыс. просмотров и по-прежнему рассчитывает - может быть, вы хотите выпустить свой скрипт на github? привет, мсек – mate64 8 July 2011 в 07:45
  • 4
    Существуют ли другие надежные сайты, которые возвращают заголовки HTTP-запросов, такие как Google? То, что я пытаюсь сделать, - это перенаправить пользователя на свои настройки языка browswer, а мой сайт - глобальный. Поэтому мне нужно полагаться на сайт, доступный на глобальном уровне и permenant. – Deckard 14 February 2012 в 09:24
  • 5
    @deckard ummm - глобальный интернет . Сценарий appengine должен работать нормально в любом месте в Интернете. Однако - это действительно взлом для разработчиков без бэкэнд - он не должен использоваться на «реальном» сайте, где у вас есть контроль над задним концом. – DanSingerman 14 February 2012 в 11:54

Для чего это необходимо, в библиотеке Universal Language Selector Wikimedia есть крючки для этого: https://www.mediawiki.org/wiki/Extension:UniversalLanguageSelector

См. function getFrequentLanguageList в ресурсах / js / ext.uls.init.js. Прямая ссылка: https://gerrit.wikimedia.org/r/gitweb?p=mediawiki/extensions/UniversalLanguageSelector.git;a=blob;f=resources/js/ext.uls.init.js;hb= HEAD

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

5
ответ дан Amir E. Aharoni 28 August 2018 в 04:20
поделиться

У меня был отличный подход, это может помочь кому-то в будущем:

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

, поэтому я устанавливаю начальную настройку в зависимости от настроек конфигурации (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 : "."}
  }
}

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

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

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

0
ответ дан Arthur Kielbasa 28 August 2018 в 04:20
поделиться

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

<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>

1
ответ дан Becca 28 August 2018 в 04:20
поделиться

На основании ответа здесь Доступ к 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();
}
0
ответ дан Community 28 August 2018 в 04:20
поделиться

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

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

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());

3
ответ дан EamonnM 28 August 2018 в 04:20
поделиться
  • 1
    Он работает в каждом браузере, который я тестировал - на рабочем столе и в мобильном телефоне. С каким браузером у вас проблемы? – EamonnM 17 July 2018 в 17:24
  • 2
    «browserLanguage», «systemLanguage» и «userLanguage» не являются свойствами хром и firefox .. но «язык» присутствует во всех браузерах. Мой плохой, что я не видел, что он вернет первый короткий код, который отвечает на вопрос .. Удаление моего предыдущего комментария .. – Jry9972 18 July 2018 в 14:15
  • 3
    Нет проблем, спасибо за удаление. – EamonnM 18 July 2018 в 16:56

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

Теперь есть способ получить Accept-Languages ​​в Firefox и Chrome с помощью navigator.languages ​​ (работает в Chrome> = 32 и Firefox> = 32)

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

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

navigator.languages
    ? navigator.languages[0]
    : (navigator.language || navigator.userLanguage)
179
ответ дан Flimzy 28 August 2018 в 04:20
поделиться
  • 1
    Альтернативная реализация, которая получает предпочтительный список языков или возвращается к языку пользовательского интерфейса (как в виде массивов): window.navigator.languages || [window.navigator.language || window.navigator.userLanguage] – Dave 15 November 2014 в 14:12
  • 2
    Получение языка с navigator.languages[0] - плохая идея. Язык моей системы по умолчанию - русский, а navigator.language возвращает правильный код lang & quot; ru & quot ;. Но navigator.languages возвращает ["en-US", "en", "ru", "uk"]. Таким образом, получение языка с индексом 0 даст вам «en-US». что неверно для моей системы. Пожалуйста, не используйте navigator.languages ​​для определения языка текущей системы. – stunpix 23 October 2015 в 12:49
  • 3
    И еще одно: navigator.languages представляет алфавитный (!) Отсортированный список языков, доступных для ввода текста в пользовательской системе. Они не сортируются в порядке предпочтения пользователя. – stunpix 23 October 2015 в 13:11
  • 4
    @stunpix это не о языке системы, а о предпочтениях в браузере. Который мог бы или не совпадать с языком системы, в зависимости от того, какой браузер был установлен. Я предлагаю вам взглянуть на настройки вашего браузера. Firefox: Preferences-Content-Languages, Chrome: настройки (расширенные) - Языки – Tim Babych 23 October 2015 в 15:37
  • 5
    @stunpix Нет, это неверно. Порядок предпочтительных языков в массиве отражает порядок, заданный пользователем: developer.mozilla.org/en-US/docs/Web/API/NavigatorLanguage/… – StanE 19 August 2016 в 12:34

В ответе Дэна Сингермана есть проблема, что заголовок должен быть использован сразу, из-за асинхронного характера ajax jQuery. Однако с его сервером приложений 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>
2
ответ дан furins 28 August 2018 в 04:20
поделиться

Если вы управляете бэкэнд и используете django, 4-строчная реализация идеи Дэна:

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 конечно)

0
ответ дан Gobi Dasu 28 August 2018 в 04:20
поделиться

Я нашел этот фрагмент кода, чтобы обнаружить язык браузера в модуле Angular Translate , который вы можете найти здесь здесь . Я слегка изменил код, заменив 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());

44
ответ дан Hamid 28 August 2018 в 04:20
поделиться
  • 1
    Это кажется более надежным, чем другие ответы JS, например. проверка на языке.length означает, что он пропустит пустые элементы в массиве языков (если это произойдет?) – EamonnM 17 May 2017 в 14:07
  • 2
    Чтобы поддерживать старые браузеры при обнаружении того, что nav.languages ​​является массивом, вы должны использовать: Object.prototype.toString.call (nav.languages) === '[object Array]' – Jaume Mussons Abad 17 November 2017 в 08:31
  • 3
    Чтобы уточнить: старые браузеры = (IE & lt; = 8.0) – Stefan Steiger 19 June 2018 в 09:58

Способ Javascript:

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

Если вы используете плагин jQuery.i18n , вы можете использовать:

jQuery.i18n.browserLang();//returns value like '"en-US"'
7
ответ дан Jaskey 28 August 2018 в 04:20
поделиться

Если вы используете ASP.NET MVC и хотите получить заголовок 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>

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

0
ответ дан Johan Franzén 28 August 2018 в 04:20
поделиться

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

28
ответ дан Josef Ježek 28 August 2018 в 04:20
поделиться
  • 1
    Просто запустите свой скрипт, en-US, на osX El Capitan на испанском языке, Chrome установлен на испанском языке, из Барселоны. Список разрешенных языков и выбор первого из них navigator.languages[0] - это не тот язык, на котором пользователь использует. – elQueFaltaba 7 July 2016 в 13:03
<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 +.

27
ответ дан Kristian Williams 28 August 2018 в 04:20
поделиться

У меня была та же проблема, и я написал следующую библиотеку только для интерфейсов, которая завершает код для нескольких браузеров. Это не много кода, но приятно не копировать и вставлять один и тот же код на нескольких сайтах.

Получить его: acceptedlanguages.js

Использовать его :

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

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

5
ответ дан Leigh McCulloch 28 August 2018 в 04:20
поделиться
var language = window.navigator.userLanguage || window.navigator.language;
alert(language); //works IE/SAFARI/CHROME/FF

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

navigator.language - это FireFox и все остальные браузеры.

Код языка: 'it' = italy, 'en-US' = english US и т. д.

< hr>

Как указано в rcoup и WebMacheter в комментариях ниже, это обходное решение не позволит вам различать английские диалекты, когда пользователи просматривают веб-сайт в браузерах другой чем IE.

window.navigator.language (Chrome / FF / Safari) возвращает всегда язык браузера, а не предпочтительный язык браузера, но: «Это довольно часто для англоязычных (gb, au, nz и т. д.) ), чтобы иметь en-us версию Firefox / Chrome / Safari. " Следовательно, window.navigator.language все равно вернет en-US, даже если пользователь предпочитает язык en-GB.

216
ответ дан Marco Demaio 28 August 2018 в 04:20
поделиться
  • 1
    Это неверно. Вызов navigator.language в Chrome вернет язык, на котором отображается Chrome, NOT предпочтительный язык пользователя (который является языком в верхней части списка языков). – thomaux 15 March 2013 в 16:39
  • 2
    @Anzeo: низкие шансы на то, что вы посещаете сайт пользователями, говорящими на одном языке, но установите браузер на другом языке, а затем также установите другой предпочтительный язык. Как говорят другие, нет достойного способа, мой ответ - простой короткий подход к решению задачи, которая обычно не заканчивается фатальными ошибками. Если вы должны быть абсолютно уверены в том, какой язык пользователь использует, вы всегда можете попросить его, добавив на ваш сайт список выбора и сохраните его выбор в файл cookie. – Marco Demaio 21 March 2013 в 19:13
  • 3
    @MarcoDemaio довольно распространено для англоязычных пользователей (gb, au, nz и т. Д.), Чтобы иметь версию Firefox / Chrome / Safari. Иногда существуют сборки en-gb, но они не популярны, и, конечно же, для других вариантов нет. – rcoup 22 August 2013 в 22:50
  • 4
    @MarcoDemaio Я считаю, что у него есть точка, поскольку en_US отличается от en_GB. Я ожидал, что en_US будет писать «цвет» и «en_GB» для написания «цвет», среди прочего. – The WebMacheter 9 April 2014 в 00:35
  • 5
    Chrome имеет window.navigator.languages с множеством предпочитаемых пользователем языков. – Styx 6 October 2015 в 06:33

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

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

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

17
ответ дан Mihai Nita 28 August 2018 в 04:20
поделиться
  • 1
    Имейте в виду, что это не является особенно надежным способом обслуживания "правильной" язык для пользователя. Многим пользователям захочется альтернативный вариант - не оставляйте их на мель! – Paul McMillan 10 November 2009 в 11:50
  • 2
    100% согласны. Используя эту информацию, это лучшее предположение. Вы должны разрешить пользователю переопределять его, если вы ошибаетесь. И если есть вероятность, что пользователь вернется, вы можете вспомнить этот выбор в cookie. Если сайт требует аутентификации, у вас может быть такая информация в профиле пользователя. – Mihai Nita 10 November 2009 в 12:12

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

languageDetector.php:

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

И просто измените эти строки из сценария jQuery:

url: "languageDetector.php",
dataType: 'json',
success: function(language) {
    nowDoSomethingWithIt(language);
}
0
ответ дан Mijail 28 August 2018 в 04:20
поделиться

Если вам нужно только поддерживать некоторые современные браузеры, вы можете теперь использовать:

navigator.languages

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

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

Но не на: IE (v11)

5
ответ дан Mr Incredible 28 August 2018 в 04:20
поделиться
  • 1
    В случае, если это помогает кому-то еще, я думал, что это будет работать в Safari в iOS 8, так как я думал, что он упал в категории modern . Я был неправ. – Austin Thompson 7 October 2014 в 17:55

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

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

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

4
ответ дан MrMesees 28 August 2018 в 04:20
поделиться

navigator.userLanguage для IE

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

14
ответ дан rink.attendant.6 28 August 2018 в 04:20
поделиться
  • 1
    navigator.userLanguage не даст ему то, что он хочет. Из userLanguage-docs: это свойство отражает настройку в разделе «Ваш язык (местоположение)»). в региональных вариантах панели управления, например, «Английский (Соединенные Штаты)». – anddoutoi 25 June 2009 в 12:48
  • 2
    Фактически он говорит, что он вернет «любое из возможных возвращаемых значений, перечисленных в языковых кодах». такой как "en" или "en-gb" msdn.microsoft.com/en-us/library/ie/ms533052.aspx msdn.microsoft.com/en-us/library/ie/ms534713.aspx – philfreo 4 September 2013 в 19:13

DanSingerman имеет очень хорошее решение для этого вопроса.

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

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

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');
5
ответ дан skython 28 August 2018 в 04:20
поделиться
  • 1
    Его плагин использует JSONP, поэтому я не думаю, что это будет совместимо. – Matthew Flaschen 20 May 2012 в 15:30

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

MSDN on:

From browserLanguage:

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

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

Примечание. Это свойство не укажите язык или языки, заданные пользователем в «Предпочтения языков», расположенные в диалоговом окне «Свойства обозревателя».

Кроме того, похоже, что browserLanguage устарела, поскольку IE8 doesn ' t перечислить его

6
ответ дан thomaux 28 August 2018 в 04:20
поделиться
  • 1
    +1, но где вы читали, что navigator.browserLanguage устарел? Это не написано в ссылках на статьи MSDN в ответ, и я просто протестировал его в IE11, и он работает! У меня больше нет IE8, но я тестировал его с помощью симулятора IE8, и он работает (я знаю, что симулятор IE8 не лучший вариант для проверки вещей). – Marco Demaio 27 August 2014 в 17:31
  • 2
    Хм, да, это кажется странным. Но я не знаю, как я пришел к такому выводу 5 лет назад & gt; – anddoutoi 28 August 2014 в 10:28
  • 3
    @anddoutoi Он недоступен в IE 8, потому что он был введен в IE 9, так что это точно противоположно тому, что вы, хотя. – Armin Šupuk 17 June 2018 в 00:54

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

Поместите файлы своего сайта в подкаталог. 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 и перенаправления к этим «различным подкаталогам» в соответствии с предоставленным им значением языка.

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

url_string = window.location.href;
if (url_string = "http://yoursite.com/it/index.html") {
    document.getElementById("page-wrapper").className = "italian";
}
0
ответ дан user612161 28 August 2018 в 04:20
поделиться

Для тех, кто ищет решение 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();
}
0
ответ дан vanduc1102 28 August 2018 в 04:20
поделиться

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

chrome.i18n.getAcceptLanguages(function(languages) {
  console.log(languages);
  // ["en-AU", "en", "en-US"]
});
6
ответ дан warrickh 28 August 2018 в 04:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: