Przykład: Internacjonalizacja aplikacji do monitorowania notowań giełdowych (Global Stock Ticker)

Flash Player 10.1 i nowsze wersje, Adobe AIR 2.0 i nowsze wersje

Aplikacja Global Stock Ticker służy do pobierania i wyświetlania fikcyjnych danych na temat notowań akcji na trzech różnych giełdach: w USA, Japonii i Europie. W tej aplikacji dane są formatowane zgodnie z konwencjami obowiązującymi w różnych regionach.

Poniższy przykład przedstawia następujące funkcje pakietu flash.globalization:

  • Formatowanie liczb uwzględniające ustawienia narodowe

  • Formatowanie walut uwzględniające ustawienia narodowe

  • Ustawianie kodu ISO waluty i symboli waluty

  • Formatowanie dat uwzględniające ustawienia narodowe

  • Pobieranie i wyświetlanie odpowiednich skrótów nazw miesięcy

Aby pobrać pliki tej przykładowej aplikacji, należy przejść na stronę www.adobe.com/go/learn_programmingAS3samples_flash_pl . Pliki aplikacji Global Stock Ticker są dostępne w folderze Samples/GlobalStockTicker. Aplikacja składa się z następujących plików:

File

Opis

GlobalStockTicker.mxml

lub

GlobalStockTicker.fla

Interfejs użytkownika dla aplikacji Flex (MXML) lub Flash (FLA).

styles.css

Style dla interfejsu użytkownika aplikacji (tylko dla aplikacji Flex).

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

Składnik MXML wyświetlający wykres danych symulowanych notowań giełdowych (tylko dla środowiska Flex)

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

Klasa dokumentu zawierająca logikę interfejsu użytkownika dla aplikacji (tylko dla aplikacji Flash).

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

Niestandardowy podprogram renderujący komórki dla składnika Flash DataGrid (tylko dla aplikacji Flash).

com/example/programmingas3/stockticker/FinancialGraph.as

Klasa ActionScript służąca do tworzenia wykresu danych symulowanych notowań giełdowych.

com/example/programmingas3/stockticker/Localizer.as

Klasa ActionScript służąca do zarządzania ustawieniami narodowymi i waluty oraz obsługi lokalizowanego formatowania liczb, kwot waluty i dat.

com/example/programmingas3/stockticker/StockDataModel.as

Klasa ActionScript przechowująca wszystkie dane przykładowe dla przykładu Global Stock Ticker.

Omówienie interfejsu użytkownika i danych przykładowych

Główne elementy interfejsu użytkownika aplikacji to:

  • pole kombinowane do wyboru ustawienia narodowego

  • pole kombinowane do wyboru giełdy

  • obiekt DataGrid do wyświetlania danych dla sześciu spółek na każdej giełdzie

  • wykres przedstawiający fikcyjne dane historyczne dla akcji wybranej spółki

Wszystkie dane przykładowe dotyczące ustawień narodowych, giełd i akcji spółek są przechowywane w aplikacji w klasie StockDataModel. W rzeczywistości aplikacja pobierałaby dane z serwera, a następnie zapisywała je do klasy takiej, jak StockDataModel. W tym przykładzie wszystkie dane są zakodowane na stałe w klasie StockDataModel.

Uwaga: Dane wyświetlone na fikcyjnym wykresie niekoniecznie muszą być zgodne z danymi wyświetlonymi w elemencie sterującym DataGrid. Wykres jest tworzony w sposób losowy za każdym razem, gdy wybrana zostanie inna spółka. Należy traktować go wyłącznie jako przykład.

Konfigurowanie ustawień narodowych

Po wykonaniu wstępnych czynności konfiguracyjnych, aplikacja wywołuje metodę Localizer.setLocale() w celu utworzenia obiektów formatter dla domyślnego ustawienia narodowego. Metoda setLocale() jest także wywoływana zawsze, gdy użytkownik wybierze nową wartość z pola kombinowanego ustawienia narodowego.

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); 
    } 
}

Na początku metoda setLocale() tworzy obiekt LocaleID. Dzięki temu obiektowi łatwiej jest później uzyskać szczegółowe informacje na temat rzeczywistego ustawienia narodowego.

Następnie metoda tworzy nowe obiekty NumberFormatter, CurrencyFormatter oraz DateTimeFormatter dla ustawienia narodowego. Po utworzeniu każdego z obiektów formatujących wywoływana jest metoda traceError(). Wyświetla ona komunikaty o błędach i komunikaty ostrzegawcze na konsoli, jeśli wystąpił problem z żądanymi ustawieniami narodowymi. (Prawdziwa aplikacja powinna raczej podejmować odpowiednie działania na podstawie takich błędów, niż tylko je śledzić).

Po utworzeniu obiektu CurrencyFormatter metoda setLocale() ustawia kod ISO waluty, symbol waluty i właściwości fractionalDigits obiektu formatter na uprzednio określone wartości. (Te wartości są ustawiane zawsze, gdy użytkownik wybierze nową giełdę z pola kombinowanego wyboru giełdy).

Po utworzeniu obiektu DateTimeFormatter metoda setLocale() pobiera również tablicę zlokalizowanych skróconych nazw miesięcy.

Formatowanie danych

Sformatowane dane giełdowe są przedstawiane w elemencie sterującym DataGrid. Każda kolumna DataGrid wywołuje funkcję etykiety, która formatuje wartość kolumny za pomocą odpowiedniego obiektu formatter.

W wersji środowiska Flash, na przykład, następujący kod służy do ustawiania kolumn 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;

W wersji tego przykładu w środowisku Flex składnik DataGrid jest deklarowany w MXML. Definiowane są również podobne funkcje etykiety dla każdej komuny.

Właściwości labelFunction odwołują się do następujących funkcji wywołujących metody formatowania klasy 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); 
}

Następnie metody Localizer ustawiają i wywołują odpowiednie obiekty formatter:

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); 
} 
|