Exemplo: Internacionalização de um aplicativo de acionamento de ações

Flash Player 10.1 e posterior, Adobe AIR 2.0 e posterior

O aplicativo Acionador de ações globais obtém e exibe dados fictícios sobre ações em três mercados de ações diferentes: dos Estados Unidos, Japão e Europa. Ele formata dos dados de acordo às convenções de várias localidades.

Este exemplo ilustra os seguintes recursos do pacote flash.globalization:

  • Formatação de número sensível a localidade

  • Formatação de moeda sensível a localidade

  • Definindo código ISO e símbolos de moeda

  • Formatação de data sensível a localidade

  • Obtendo e exibindo abreviações apropriadas de nome de meses

Para obter os arquivos de aplicativo desse exemplo, consulte www.adobe.com/go/learn_programmingAS3samples_flash_br . Os arquivos do aplicativo Acionador de ações globais podem ser localizados no diretório Samples/GlobalStockTicker. O aplicativo consiste nos seguintes arquivos:

Arquivo

Descrição

GlobalStockTicker.mxml

ou

GlobalStockTicker.fla

A interface do usuário do aplicativo para Flex (MXML) ou Flash (FLA).

styles.css

Estilos da interface de usuário do aplicativo (somente no Flex).

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

Um componente MXML que exibe um gráfico de dados de simulados de ações, apenas para o Flex.

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

Classe Document que contém a lógica da interface de usuário do aplicativo (somente no Flash).

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

Um processador de célula personalizado para o componente Flash DataGrid (apenas no Flash).

com/example/programmingas3/stockticker/FinancialGraph.as

Uma classe ActionScript que desenha um gráfico de dados simulados de ações.

com/example/programmingas3/stockticker/Localizer.as

Uma classe ActionScript que gerencia a localidade e a moeda e manipula a formatação localizada de números, quantidades de moeda e datas.

com/example/programmingas3/stockticker/StockDataModel.as

Uma classe ActionScript que armazena todos os dados de amostra para o exemplo do Acionador de ações globais.

Entendendo a interface do usuário e amostra de dados

Os elementos da interface do usuário principal do aplicativo são:

  • uma caixa combinada para selecionar uma Localidade

  • uma caixa combinada para selecionar um Mercado

  • um DataGrid que exibe dados para seis empresas em cada mercado

  • um gráfico que mostra dados de histórico simulados para as ações da empresa selecionada

O aplicativo armazena todos os seus dados de amostra sobre localidades, mercados e ações de empresas na classe StockDataModel. Um aplicativo real deve obter dados de um servidor e, em seguida, armazená-los em uma classe como a StockDataModel. Neste exemplo, todos os dados estão codificados na classe StockDataModel.

Nota: Os dados exibidos no gráfico financeiro não correspondem necessariamente com os dados no controle do DataGrid. O gráfico é redesenhado aleatoriamente cada vez que uma empresa diferente é selecionada. Para propósitos ilustrativos apenas.

Definindo a localidade

Depois de algum trabalho inicial de configuração, o aplicativo chama o método Localizer.setLocale() para criar objetos formatadores para a localidade padrão. O método setLocale() também é chamado a cada vez que o usuário seleciona um novo valor da caixa combinada de Localidade.

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

Primeiro o método setLocale() cria um objeto LocaleID. Isto faz com que seja mais fácil obter detalhes sobre a localidade real posteriormente, se necessário.

Em seguida ele cria novos objetos NumberFormatter, CurrencyFormatter e DateTimeFormatte para a localidade. Após criar cada objeto formatador, o método traceError() é chamado. Este método exibe erros e mensagens de avisos no consolte, caso exista um problema na localidade solicitada. (Um aplicativo real deve executar ações com base nestes erros, em vez de somente rastreá-los).

Depois de criar o objeto CurrencyFormatter, o método setLocale() define o código ISO de moeda do formatador, símbolo de moeda e propriedades fractionalDigits para valores préviamente determinados. (Estes valores são definidos cada vez que o usuário seleciona um novo mercado da caixa combinada Mercados).

Depois de criar o objeto DateTimeFormatter, o método setLocale() também obtém uma matriz de abreviações de nomes de meses localizados.

Formatando os dados

Os dados de ações formatados são apresentados em um controle DataGrid. Cada coluna DataGrid chama uma função de rótulo que formata o valor da coluna utilizando o objeto formatador apropriado.

Na versão do Flash, por exemplo, o seguinte código define as colunas 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;

A versão do Flex do exemplo declara seu DataGrid no MXML. Isto também define funções de rótulo semelhantes para cada coluna.

As propriedades labelFunction se referem às seguintes funções, as quais chamam métodos de formatação da classe 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); 
}

Os métodos Localizer então definem e chamam os formatadores apropriados:

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