Ресурсы, 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.javaimport 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.javapackage 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 в заданной временной зоне. |