Ресурсы, i18n, TimeZone в GWT

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

Использование ресурсных файлов (Image, *.properties), TimeZone в GWT-проекте имеет существенное отличие от того, что применяется в обычной Java. Связано это прежде всего с тем, что GWT компилятор преобразует исходный java-код в JavaScript, для преобразование в который у него имеются свои классы, методы и подходы. Эту особеннось GWT следует учитывать и использовать соответствующие объекты/классы, чтобы на этапе компиляции не получить набор ошибок.

На данной странице будут рассмотрены следующие вопросы при использовании фреймворка GWT :

  • использование ресурсных файлов изображений;
  • использование текстовых ресурсных файлов, локализация приложения i18n;
  • учет временной зоны TimeZone при работе с датой.

Подключение ресурсов

В качестве ресурсных файлов создадим Images.java и Text.java, которые должны расширять (extends) свойства класса com.google.gwt.resources.client.ClientBundle. Дополнительно создадим файл Resources.java, в котором определим наши instances (IMAGES, TEXT) для работы с ресурсами :

Листинг ресурсного файла Resources.java

import com.google.gwt.core.client.GWT;

public class Resources
{
    public static final Images IMAGES = GWT.create(Images.class);
    public static final Text   TEXT   = GWT.create(Text.class  );
}

Экземпляры ресурсных классов Images и Text создаются стандартным для GWT методом. Следует обратить внимание, что ресурсные файлы являются интерфейсами (см. код ниже), включающими определенные методы. Однако реализации этих методов в java-коде проекта не требуется.

Ресурсный файл изображений

Ресурсный файл изображений Images включает три метода/функции типа ImageResource. Для каждого метода должна присутствовать аннотация @Source, в которой указывается относительный путь и наименование изображения. Так если Images.java располагается в директории «com.common», то файлы изображений, которые в нем определены, размещаются в поддиректории «com.common.images».

Листинг интерфейса Images.java

package com.common;

import com.google.gwt.core.client.GWT;
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.ImageResource;

public interface Images extends ClientBundle 
{
    @Source("images/cut.gif")
    ImageResource cut();

    @Source("images/paste.gif")
    ImageResource paste();

    @Source("images/delete.gif")
    ImageResource delete();
}

Для размещения иконки на кнопке типа TextButton библиотеки GXT можно использовать следующий код :

TextButton item = new TextButton("");
item.setIcon(Resources.IMAGES.cut());

Локализация GWT сообщений

При локализации сообщений необходимо учитывать особенности наименований файлов свойств (*.properties) и их подключение в GWT-приложении. Что касается наименований, то здесь следует помнить, что наименование файлов свойств должно совпадать с наименованием текстового ресурсного файла. Так, например, если ресурсный файл имеет наименование Text.java, то и соответствуюшие файлы свойств также должны начинаться с этого имени (Text.properties, Text_ru.properties, Text_en.properties и т.д.). Количество ресурсных файлов и соответствующее им количество файлов свойств, а также их наименования в GWT-проекте ограничений не имеют. Текстовые ресурсные файлы и соответствующие им файлы своств должны располагаться в одной директории проекта.

Листинг текстового ресурсного файла Text.java

Текстовый ресурсный файл Text.java включает три метода/функции типа String. Для каждого метода должно присутствовать соответствующее свойство в файле свойств.

import com.google.gwt.i18n.client.Constants;

public interface Text extends Constants
{
    String title();
    String cut  ();
    String paste();
    String exit ();
}

Листинг файла свойств Text.properties

title=GWT-GXT Toolbar
cut=Cut
paste=Paste
exit=Exit

Для размещения локализованного сообщения на визуальном компоненте или в тексте сообщения в качестве примера используем кнопку библиотеки GXT :

TextButton item = new TextButton(Resources.TEXT.paste());

При подключении соответствующих текстовых ресурсных файлов объекта Locale не требуется; подключение осуществляется в файле конфигурации GWT-проекта (XXX.gwt.xml). Ниже представлен код использования файлов свойств с кириллицей :

<extend-property name="locale" values="ru"      />
<set-property name="locale" value="ru"          />
<set-property-fallback name="locale" value="ru" />

Примечание : визуальные GWT компоненты можно также локализовать на уровне файла конфигурации GWT-проекта. Это, в первую очередь, относится к календарю «com.google.gwt.user.datepicker.client.DatePicker».

Учет TimeZone при работе с датой в GWT

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

В Java для работы с датами используют объекты java.util.Date. Внутри этот объект хранит дату как число миллисекунд с 1970 года в GMT (UTC). Объект Date по сути является «оберткой» над одним единственным полем long. Любые сравнения дат сводятся к сравнению миллисекунд. Имеется API, которое позволяет получать даты в разных TimeZone.

Форматирование даты в GWT по маске выполняется классом DateTimeFormat. Однако дата зависит от клиентской временной зоны TimeZone, т.е. часового пояса, который установили на компьютере. Для WEB-приложений это критично, поскольку в приложениях временная зона сервера может не соответствовать временной зоне клиента. Можно, конечно, создать сервис и получать соответствующие данные от сервера. Но «тревожить сервер по пустякам» - не очень то правильно.

Ниже представлены два метода createDateUTC для преобразования даты в текстовую строку и создания объекта типа UTC во временной зоне UTC (Лондон) при использовании фреймворка GWT.

import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.i18n.client.TimeZone;
import com.google.gwt.i18n.client.constants.TimeZoneConstants;
. . .
String            DATE_TIME_FORMAT = "dd.MM.yyyy HH:mm:ss";

DateTimeFormat    dtf = null;
TimeZoneConstants tzc = null;
TimeZone          utc = null;
//----------------------------------------------------------------
public static String createDateUTC(Date date)
{
    dtf = DateTimeFormat.getFormat(DATE_TIME_FORMAT);
    return dtf.format(date);		
}
//----------------------------------------------------------------
public Date createDateUTC()
{
    tzc = (TimeZoneConstants) GWT.create(TimeZoneConstants.class);
    utc = TimeZone.createTimeZone(tzc.europeLondon());

    dtf = DateTimeFormat.getFormat(DATE_TIME_FORMAT);
    String date = dtf.format(new Date(), utc);
    return dtf.parse(date);
}

Для преобразования Date в текстовую строку в первом методе используется маска DATE_TIME_FORMAT и объект DateTimeFormat.

Во втором методе сначала выбирается временная зона TimeZone, после этого подготавливается объект форматирования DateTimeFormat и далее создается Date в заданной временной зоне.

  Рейтинг@Mail.ru