Пример. Интернационализация приложения, передающего котировки ценных бумагFlash Player 10.1 и более поздних версий, Adobe AIR 2.0 и более поздних версий Приложение Global Stock Ticker извлекает и отображает фиктивные данные о ценных бумагах на трех различных рынках ценных бумаг: США, Япония и Европа. Оно форматирует данные в соответствии с нормами, принятыми для различных локалей. Этот пример демонстрирует следующие функции пакета flash.globalization:
Получить файлы приложения для этого примера можно на странице www.adobe.com/go/learn_programmingAS3samples_flash_ru. Файлы приложения Global Stock Ticker находятся в папке Samples/GlobalStockTicker. Приложение состоит из следующих файлов.
Описание пользовательского интерфейса и выборочных данныхОсновными элементами пользовательского интерфейса приложения являются:
В приложении все выборочные данные о локалях, рынках и ценных бумагах компании хранятся в классе StockDataModel. Реальное приложение будет извлекать данные с сервера и сохранять их в классе, например StockDataModel. В этом примере все данные жестко закодированы в классе StockDataModel. Примечание. Данные, отображаемые на финансовой диаграмме, необязательно должны соответствовать данным, показанным в элементе управления DataGrid. Диаграмма перерисовывается в произвольной форме каждый раз при выборе другой компании. Этот пример предназначен только для наглядного представления.
Установка локалиПосле первоначальной настройки приложение вызывает метод Localizer.setLocale() для создания объекта форматирования для локали по умолчанию. Метод setLocale() также вызывается каждый раз, когда пользователь выбирает новое значение в раскрывающемся списке локалей. public function setLocale(newLocale:String):void
{
locale = new LocaleID(newLocale);
nf = new NumberFormatter(locale.name);
traceError(nf.lastOperationStatus, "NumberFormatter", nf.actualLocaleIDName);
cf = new CurrencyFormatter(locale.name);
traceError(cf.lastOperationStatus, "CurrencyFormatter", cf.actualLocaleIDName);
symbolIsSafe = cf.formattingWithCurrencySymbolIsSafe(currentCurrency);
cf.setCurrency(currentCurrency, currentSymbol);
cf.fractionalDigits = currentFraction;
df = new DateTimeFormatter(locale.name, DateTimeStyle.LONG, DateTimeStyle.SHORT);
traceError(df.lastOperationStatus, "DateTimeFormatter", df.actualLocaleIDName);
monthNames = df.getMonthNames(DateTimeNameStyle.LONG_ABBREVIATION);
}
public function traceError(status:String, serviceName:String, localeID:String) :void
{
if(status != LastOperationStatus.NO_ERROR)
{
if(status == LastOperationStatus.USING_FALLBACK_WARNING)
{
trace("Warning - Fallback locale ID used by "
+ serviceName + ": " + localeID);
}
else if (status == LastOperationStatus.UNSUPPORTED_ERROR)
{
trace("Error in " + serviceName + ": " + status);
//abort application
throw(new Error("Fatal error", 0));
}
else
{
trace("Error in " + serviceName + ": " + status);
}
}
else
{
trace(serviceName + " created for locale ID: " + localeID);
}
}
Сначала метод setLocale() создает объект LocaleID. При необходимости этот объект позволит упростить получение сведений о фактической локали впоследствии. Затем он создает новые объекты NumberFormatter, CurrencyFormatter и DateTimeFormatter для локали. После создания каждого объекта форматирования он вызывает метод traceError(). Этот метод отображает сообщение об ошибке или предупреждение на консоли, если возникает проблема с запрошенной локалью. (В реальном приложении необходимо не только отслеживать эти ошибки, но и реагировать на них). После создания объекта CurrencyFormatter метод setLocale() задает код валюты по ISO, символ валюты и свойства fractionalDigits в средстве форматирования для ранее определенных значений. (Эти значения задаются каждый раз, когда пользователь выбирает новый рынок в раскрывающемся списке рынков). После создания объекта DateTimeFormatter метод setLocale() также извлекает массив локализованных сокращенных названий месяцев. Форматирование данныхОтформатированные данные о ценных бумагах представляются в элементе управления DataGrid. Каждый столбец DataGrid вызывает функцию label, которая форматирует значение в столбце с использованием подходящего объекта форматирования. В версии Flash, например, следующий код устанавливает столбцы DataGrid: var col1:DataGridColumn = new DataGridColumn("ticker");
col1.headerText = "Company";
col1.sortOptions = Array.NUMERIC;
col1.width = 200;
var col2:DataGridColumn = new DataGridColumn("volume");
col2.headerText = "Volume";
col2.width = 120;
col2.cellRenderer = RightAlignedCell;
col2.labelFunction = displayVolume;
var col3:DataGridColumn = new DataGridColumn("price");
col3.headerText = "Price";
col3.width = 70;
col3.cellRenderer = RightAlignedCell;
col3.labelFunction = displayPrice;
var col4:DataGridColumn = new DataGridColumn("change");
col4.headerText = "Change";
col4.width = 120;
col4.cellRenderer = RightAlignedCell;
col4.labelFunction = displayPercent;
В версии Flex этого примера объект DataGrid объявляется в файле MXML. В ней также задаются такие же функции label для каждого столбца. Свойства labelFunction обращаются к следующим функциям, которые вызывают методы форматирования класса Localizer: private function displayVolume(item:Object):String
{
return localizer.formatNumber(item.volume, 0);
}
private function displayPercent(item:Object):String
{
return localizer.formatPercent(item.change ) ;
}
private function displayPrice(item:Object):String
{
return localizer.formatCurrency(item.price);
}
После этого методы Localizer настраивают и вызывают подходящие средства форматирования: public function formatNumber(value:Number, fractionalDigits:int = 2):String
{
nf.fractionalDigits = fractionalDigits;
return nf.formatNumber(value);
}
public function formatPercent(value:Number, fractionalDigits:int = 2):String
{
// HACK WARNING: The position of the percent sign, and whether a space belongs
// between it and the number, are locale-sensitive decisions. For example,
// in Turkish the positive format is %12 and the negative format is -%12.
// Like most operating systems, flash.globalization classes do not currently
// provide an API for percentage formatting.
nf.fractionalDigits = fractionalDigits;
return nf.formatNumber(value) + "%";
}
public function formatCurrency(value:Number):String
{
return cf.format(value, symbolIsSafe);
}
public function formatDate(dateValue:Date):String
{
return df.format(dateValue);
}
|
|
|