Ключевое слово static
изменяет жизненный цикл метода или переменной внутри класса. Метод / переменная static
создается во время загрузки класса. Метод или переменная, которая не объявлена как static
, создается только тогда, когда класс создается как объект, например, с помощью оператора new
.
Жизненный цикл класса в широком смысле, is:
new
, используя класс, чтобы сделать экземпляр класса как фактического объекта, а затем, когда он сделан с объектом Чтобы иметь начальную точку входа для приложения, 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
}
}
Я думаю, основная проблема здесь в том, что настройки браузера не влияют на свойство 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
Для чего это необходимо, в библиотеке 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) и, конечно же, пользовательские настройки сайта.
У меня был отличный подход, это может помочь кому-то в будущем:
клиенту нужна страница, на которой вы можете поменять языки. Мне нужно было форматировать номера по этому параметру (не настройке браузера / не по какой-либо предопределенной настройке)
, поэтому я устанавливаю начальную настройку в зависимости от настроек конфигурации (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 : "."}
}
}
, поэтому я использовал заданный язык страницы, и в качестве резервного я использовал настройки браузера.
, которые также должны быть полезны для тестирования.
в зависимости от ваших клиентов вам могут не понадобиться эти настройки.
Прежде всего, извините меня за мой английский. Я хотел бы поделиться своим кодом, потому что он работает, и он отличается от других, заданных пользователем. В этом примере, если вы говорите по-французски (Франция, Бельгия или другой французский язык), вы перенаправляетесь на французскую страницу, иначе на странице на английском, в зависимости от конфигурации браузера:
<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>
На основании ответа здесь Доступ к 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();
}
Я использовал какое-то время для ответа Хамида, но в тех случаях, когда массив языков похож на ["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());
Обновление 2014 года.
Теперь есть способ получить Accept-Languages в Firefox и Chrome с помощью navigator.languages (работает в Chrome> = 32 и Firefox> = 32)
Кроме того, navigator.language в Firefox в эти годы отражает наиболее предпочтительный язык контента, а не язык пользовательского интерфейса. Но поскольку это понятие еще не поддерживается другими браузерами, это не очень полезно.
Итак, чтобы получить наиболее предпочтительный язык контента, когда это возможно, и использовать язык пользовательского интерфейса как резерв:
navigator.languages
? navigator.languages[0]
: (navigator.language || navigator.userLanguage)
window.navigator.languages || [window.navigator.language || window.navigator.userLanguage]
– Dave
15 November 2014 в 14:12
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
navigator.languages
представляет алфавитный (!) Отсортированный список языков, доступных для ввода текста в пользовательской системе. Они не сортируются в порядке предпочтения пользователя.
– stunpix
23 October 2015 в 13:11
В ответе Дэна Сингермана есть проблема, что заголовок должен быть использован сразу, из-за асинхронного характера 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>
Если вы управляете бэкэнд и используете 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 конечно)
Я нашел этот фрагмент кода, чтобы обнаружить язык браузера в модуле 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());
Способ Javascript:
var language = window.navigator.userLanguage || window.navigator.language;//returns value like 'en-us'
Если вы используете плагин jQuery.i18n , вы можете использовать:
jQuery.i18n.browserLang();//returns value like '"en-US"'
Если вы используете 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>
Конечно, вы можете использовать аналогичный подход с другими серверными технологиями, как упомянули другие.
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
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 +.
У меня была та же проблема, и я написал следующую библиотеку только для интерфейсов, которая завершает код для нескольких браузеров. Это не много кода, но приятно не копировать и вставлять один и тот же код на нескольких сайтах.
Получить его: acceptedlanguages.js
Использовать его :
<script src="acceptedlanguages.js"></script>
<script type="text/javascript">
console.log('Accepted Languages: ' + acceptedlanguages.accepted);
</script>
Он всегда возвращает массив, упорядоченный по предпочтениям пользователей. В Safari & amp; IE массив всегда имеет длину. В FF и Chrome это может быть несколько языков.
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 и т. д.
Как указано в rcoup и WebMacheter в комментариях ниже, это обходное решение не позволит вам различать английские диалекты, когда пользователи просматривают веб-сайт в браузерах другой чем IE.
window.navigator.language
(Chrome / FF / Safari) возвращает всегда язык браузера, а не предпочтительный язык браузера, но: «Это довольно часто для англоязычных (gb, au, nz и т. д.) ), чтобы иметь en-us версию Firefox / Chrome / Safari. " Следовательно, window.navigator.language
все равно вернет en-US
, даже если пользователь предпочитает язык en-GB
.
navigator.language
в Chrome вернет язык, на котором отображается Chrome, NOT предпочтительный язык пользователя (который является языком в верхней части списка языков).
– thomaux
15 March 2013 в 16:39
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
Если вы не хотите полагаться на внешний сервер, и у вас есть свой собственный, вы можете использовать простой 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);
}
Если вам нужно только поддерживать некоторые современные браузеры, вы можете теперь использовать:
navigator.languages
, который возвращает массив языковых настроек пользователя в порядке, указанном пользователем.
На данный момент (сентябрь 2014) это работает на: Chrome (v37), Firefox (v32) и Opera (v24)
Но не на: IE (v11)
Я только что придумал это. Он сочетает в себе новый синтаксис деструкции JS с несколькими стандартными операциями для извлечения языка и языка.
var [lang, locale] = (((navigator.userLanguage || navigator.language).replace('-', '_')).toLowerCase()).split('_');
Надеюсь, что это поможет кому-то
navigator.userLanguage
для IE
window.navigator.language
для firefox / opera / safari
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');
Я не могу найти ни одной ссылки, в которой утверждается, что это возможно без участия сервера.
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.
Примечание. Это свойство не укажите язык или языки, заданные пользователем в «Предпочтения языков», расположенные в диалоговом окне «Свойства обозревателя».
blockquote> blockquote>Кроме того, похоже, что
browserLanguage
устарела, поскольку IE8 doesn ' t перечислить его
navigator.browserLanguage
устарел? Это не написано в ссылках на статьи MSDN в ответ, и я просто протестировал его в IE11, и он работает! У меня больше нет IE8, но я тестировал его с помощью симулятора IE8, и он работает (я знаю, что симулятор IE8 не лучший вариант для проверки вещей).
– Marco Demaio
27 August 2014 в 17:31
У меня есть хак, который, я думаю, использует очень мало кода и достаточно надежный.
Поместите файлы своего сайта в подкаталог. 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";
}
Для тех, кто ищет решение 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();
}
Если вы разрабатываете приложение / расширение Chrome, используйте chrome.i18n API .
chrome.i18n.getAcceptLanguages(function(languages) {
console.log(languages);
// ["en-AU", "en", "en-US"]
});