Пример. Интернационализация приложения, передающего котировки ценных бумаг

Flash Player 10.1 и более поздних версий, Adobe AIR 2.0 и более поздних версий

Приложение Global Stock Ticker извлекает и отображает фиктивные данные о ценных бумагах на трех различных рынках ценных бумаг: США, Япония и Европа. Оно форматирует данные в соответствии с нормами, принятыми для различных локалей.

Этот пример демонстрирует следующие функции пакета flash.globalization:

  • Форматирование чисел с учетом локали.

  • Форматирование валют с учетом локали.

  • Задание кода валюты по ISO и символов валюты.

  • Форматирование дат с учетом локали.

  • Получение и отображение соответствующих сокращенных названий месяцев.

Получить файлы приложения для этого примера можно на странице www.adobe.com/go/learn_programmingAS3samples_flash_ru . Файлы приложения Global Stock Ticker находятся в папке Samples/GlobalStockTicker. Приложение состоит из следующих файлов.

File

Описание

GlobalStockTicker.mxml

или

GlobalStockTicker.fla

Пользовательский интерфейс приложения для Flex (MXML) или Flash (FLA).

styles.css

Стили пользовательского интерфейса приложения (только Flex).

com/example/programmingas3/stockticker/flex/FinGraph.mxml

Компонент MXML, который отображает диаграмму для смоделированных данных о ценных бумагах (только для Flex).

com/example/programmingas3/stockticker/flash/GlobalStockTicker.as

Класс документа, отвечающий за поведение интерфейса пользователя для приложения (только для Flash).

comp/example/programmingas3/stockticker/flash/RightAlignedColumn.as

Пользовательское средство визуализации ячеек для компонента Flash DataGrid (только для Flash).

com/example/programmingas3/stockticker/FinancialGraph.as

Класс ActionScript, вычерчивающий диаграмму для смоделированных данных о ценных бумагах.

com/example/programmingas3/stockticker/Localizer.as

Класс ActionScript, управляющий локалью и валютой и обрабатывающий локализованное форматирование чисел, денежных сумм и дат.

com/example/programmingas3/stockticker/StockDataModel.as

Класс ActionScript, хранящий выборочные данные для приложения Global Stock Ticker.

Описание пользовательского интерфейса и выборочных данных

Основными элементами пользовательского интерфейса приложения являются:

  • раскрывающийся список для выбора локали;

  • раскрывающийся список для выбора рынка;

  • объект DataGrid, отображающий данные для шести компаний на каждом рынке;

  • диаграмма, показывающая смоделированную хронологию данных для выбранной категории ценных бумаг компании.

В приложении все выборочные данные о локалях, рынках и ценных бумагах компании хранятся в классе 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); 
} 
|