Loading...
Important Notice - Forums is archived

To simplify things and help our users to be more productive, we have archived the current forum and focus our efforts on helping developers on Stack Overflow. You can post new questions on Stack Overflow or join our Discord channel.

Product icon
TUTORIAL

Vaadin lets you build secure, UX-first PWAs entirely in Java.
Free ebook & tutorial.

Хелп! gwt.i18n.DateFormat

Alexey Morozov
9 years ago Jun 24, 2013 2:47pm
Denis Anisimov
9 years ago Jun 24, 2013 4:19pm

Вы этот add-on имеете ввиду ?
http://vaadin.com/addon/digitalclock
Если этот, то без модификации самого виджета Вам, боюсь, не обойтись.
Вот код виджета: http://askvikrant.com/wp-askvikra-content/uploads/DigitalClockWidget.java_.txt
Как Вы можете видеть про локаль здесь никто не думает. Ипользуется дефолтная. Именно замена дефолтной
даёт возможность Вам использовать meta тег с заменой дефолтной локали на ту что вам нужно при загрузки страницы.

Для того чтобы менять локаль на лету (програмно) нужно использовать локаль, кот. передаётся сервером
через коннектор (rpc или через State) . Тот коннектор что там есть сейчас про локаль ничего знает :
http://askvikrant.com/wp-askvikra-content/uploads/DigitalClockConnector.java_.txt

метод setLocale() есть в AbstractComponent, так что он передаётся от сервера к клиету скорее всего через State.
Нужно только его считать в коннекторе и выставить в виджет для использования в методах форматирования.

Alexey Morozov
9 years ago Jun 25, 2013 6:44am
Denis Anisimov
9 years ago Jun 25, 2013 7:34am

А, так у Вас проблема не с Vaadin-вской коммуникацией, а с GWT.
Тут я не возмусь советовать что-то определённое. Насколько я понимаю, GWT локализацию собирает статически
(то есть знает только про те локали, кот. были прописаны в файле модуля при сборке). Так что произвольную локаль на лету использовать не получится. Доступны будут только те, с кот. было сконфигурировано приложение.
По всей видимости не предполагается также и замены локали в загруженном приложении . Нужно его перегружать полностью. Так что нужно, видимо, использовать что то вроде этого :
http://stackoverflow.com/questions/6275975/how-can-i-get-all-date-time-format-pattern-in-gwt-for-different-locales
То есть конкретные имплементации классов для каждой локали (соот-но нужно знать заранее список нужных локалей).

Alexey Morozov
9 years ago Jun 25, 2013 8:33am
Denis Anisimov
9 years ago Jun 26, 2013 2:07pm

"Штатными" средствами Vaadin манипулировать HTML-ем на таком уровне не получится. Но всегда можно влезть в клиентскую часть. Там можно использовать GWT и чистый JS.
Посмотрите, например вот это: https://vaadin.com/blog/-/blogs/vaadin-7-loves-javascript-components

Denis Anisimov
9 years ago Jun 26, 2013 2:11pm

Да, и вот ещё что. Используя Vaadin, обычно не принято использовать локализацию на уровне GWT. Поскольку всегда есть серверная часть, используют локализацию с сервера, а на клиент пересылают уже локализованные данные. В лоб с датой так неполучится, потому что нужна не дата сервера, а клиента, но можно посмотреть в сторону формирования строки формата для даты на сервере, а на клиенте просто подставить в строку формата уже нужные значения. Как то так.

Alexey Morozov
9 years ago Jun 27, 2013 5:58am
Denis Anisimov
9 years ago Jun 27, 2013 7:36am
Alexey Morozov
9 years ago Jun 27, 2013 11:28am
Denis Anisimov
9 years ago Jun 27, 2013 1:00pm

Ну это ровно то, что я Вам предлагал в своём втором посте про использование конкретных имплементаций для каждой локали в отдельности. Но это ограничивает код теми локалями, под кот. написана импл-ия. Нельзя взять и добавить новую на лету. Это не расширяемо.

Насчёт таймера: cancel должен работать. Если только Вы его не на null вызываете (потому что я не вижу у Вас кода таймера, при том что у Вас их аж целых два).

Ну и самое главное :) Henri Sara сказал мне что мы тут изобретаем велосипед. Всё уже сделано до нас.
Есть класс DateTimeService. Это то что Вам нужно вместо GWT-ных форматов. Так что GWT Вам не нужен.
Этому классу можно установить локаль через метод : setLocale() (или в конструкторе). Класс клиентский (на стороне броузера). И дальше можно использовать его для форматирования даты.
Теперь, вопрос получения локали - это тоже изрбретения велосипеда. Она и так передаётся при вызове метода setLocale() (у серверной компоненты). Не нужно писать свой кустарый код для её передачи и получения на
стороне клиента. Вопрос: как её получить в клиенте. Можно посмотреть пример: AbstractDateFieldConnector.
Используется старый (от Vaadin 6) способ обработки полученных данных от сервера, через метод updateFromUIDL().
Для того чтобы его задействовать Вам нужно имплементировать интерфейс Paintable в коннекторе.
Он как раз и заставит импл-ть метод updateFromUIDL().

В его импле-ии нужно только вызвать в самом начале :

if (!isRealUpdate(uidl)) {
            return;
}

а потом забрать локаль:

DateTimeService service = new DateTimeService();
if (uidl.hasAttribute("locale")) {
            final String locale = uidl.getStringAttribute("locale");
            service.setLocale(locale);
}

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

В общем, спасибо Henri.

Alexey Morozov
9 years ago Jun 27, 2013 1:58pm
Denis Anisimov
9 years ago Jun 27, 2013 2:14pm
Denis Anisimov
9 years ago Jun 27, 2013 2:19pm
Denis Anisimov
9 years ago Jun 27, 2013 3:57pm

Henri вот ещё насчёт компиляции справедливо заметил, что:

  • Можно ограничиться сборкой только одной permutation (для конктертного броузера), выставив свойство в gwt.xml, например <set-property name="user.agent" value="gecko1_8"/>
  • Убрать оптимизацию, используя draft флаг : добавить -draftCompile в строку аргументов компилятора
  • Использовать рецепты отсюда:
  • Наконец, использовать Dev mode во время разработки конкретного виджета. Это вообще то стоит поставить самым первым пунктом. Здесь всё будет собираться на лету и работать прямо в JVM. Это существенно ускоряет разработку.

Всё это можно делать для ускорения разработки виджетов. Потом нужно будет всё таки скомпилировать без всех этих настроек, включив всё назад. Но это нужно сделать будет только один раз для финального результата.
Чисто серверную же часть уже можно писать без компиляции виджетов в нормальном окружении.

Alexey Morozov
9 years ago Jun 28, 2013 8:04am
Alexey Morozov
9 years ago Jun 28, 2013 10:05am