Ресурсы, i18n, TimeZone в GWTВопросы интернационализации приложения (i18n - internationalization) приходится рассматривать для каждого фреймворка отдельно, поскольку имеются порой значительные отличия по размещению ресурсных файлов и их применению. Использование ресурсных файлов (Image, *.properties), TimeZone в GWT-проекте имеет существенное отличие от того, что применяется в обычной Java. Связано это прежде всего с тем, что GWT компилятор преобразует исходный java-код в JavaScript, для преобразование в который у него имеются свои классы, методы и подходы. Эту особеннось GWT следует учитывать и использовать соответствующие объекты/классы, чтобы на этапе компиляции не получить набор ошибок. На данной странице будут рассмотрены следующие вопросы при использовании фреймворка GWT :
Подключение ресурсовВ качестве ресурсных файлов создадим 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.propertiestitle=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 в заданной временной зоне. |
