*
MSDN*
resultados por Bing
|Developer Centers|Biblioteca|Downloads|Assinaturas MSDN
Pesquisa rápida


Globalização - Preparando a UI de um aplicativo ASP.NET para diferentes idiomas

Por Roberto Lopes

Este artigo discuteEste artigo usa as seguintes tecnologias

Visão geral de localização em .NET;

Cultura e localização;

Localização implícita e explícita.

Visual Studio 2005, ASP.NET 2.0.

Podemos dizer que "globalizar" significa mais do que "traduzir" o seu aplicativo para um ou mais idiomas, mas sim prepará-lo para funcionar em mais de uma "cultura", isso é, outro idioma, outro formato de data/hora, moeda etc. A plataforma .NET trouxe muitas novidades nesse sentido, principalmente em sua versão 2.0. Neste artigo estarei focando especificamente a customização de mais de um idioma em um aplicativo Web utilizando ASP.NET 2.0, isso é, a cultura da interface de usuário, ou User Interface (UI).

Visão geral de localização em .NET

Dizer "Localizar" um aplicativo é análogo a dizer ajustar a cultura de um aplicativo (vide o quadro Cultura). Observe alguns itens passíveis de localização na Tabela 1.

ItemDescrição

Formato de Data

Cada país possui uma notação padrão para datas. Exemplo: Brasil utiliza o padrão dd/mm/aaaa; EUA utiliza mm/dd/aaaa

Idioma

Seria como traduzir o seu aplicativo para dois ou mais idiomas. Com o .NET Framework 2.0, isso é possível sem que uma linha de código seja escrita

Formato de moeda

Tal qual o formato de data, cada país tem sua notação padrão para moeda. Por exemplo, Brasil utiliza R$999.999,99; EUA utiliza $999,999.99

Tabela 1. Exemplo de itens passíveis de localização

Cultura

Uma cultura representa uma localidade ou país. O Windows utiliza o padrão RFC 1766 para referenciar uma cultura, utilizando a seguinte notação: <Idioma>-<País/CódigoRegião> Exemplo: pt-BR (Português e Brasil), en-US (inglês e Estados Unidos), fr-FR (Francês e França), es-MX (Espanhol e México).

Idioma - Representado por duas ou três letras minúsculas, derivadas do padrão ISO 639-1 (duas letras) ou ISO 639-2 (três letras).

País/Região - Representado por duas letras maiúsculas, derivadas do padrão ISO 3166.

Existem dois tipos de cultura a serem consideradas em um aplicativo ASP.NET:

Culture - Responsável pela formatação de dados a serem utilizados pelo sistema (data, moeda etc.);

UICulture - Responsável pela formatação dos recursos a serem apresentados na interface com o usuário, isso é, tradução dos dados existentes no Web Form (conteúdo de labels, botões, títulos, tooltips etc.).

Como já dito anteriormente, o foco deste artigo está voltado a preparar o aplicativo Web para trabalhar com mais de um idioma. Deste modo, fica claro que estaremos utilizando UICulture.

Existem dois tipos de localização de uma página: Implícita e Explícita:

Implícita - Utiliza recursos locais (um conjunto de arquivos para uma única página). Cada página (ASPX) possui um arquivo de recurso (RESX) para cada idioma. Cada página deverá ter um arquivo de recurso para cada idioma, sendo que todos os arquivos de recurso de uma determinada página deverão ter as mesmas propriedades, somente variando os valores. Cada componente da página é associado a um ou mais itens do arquivo de recurso. Exemplo: se a página default.aspx for traduzida para o inglês e o português, dois arquivos de recurso serão criados para essa página: um para inglês e outro para português (sem considerar o idioma neutro, que falaremos mais adiante). Se o item lblTitulo.Text existir no arquivo de recurso para inglês, deverá também existir para português. Podemos dizer ainda que a localização implícita está diretamente ligada ao atributo "meta:resourcekey", que será visto mais adiante.

Explícita - Utiliza recursos globais (um conjunto de arquivos compartilhado para todo o assembly). A localização explícita é utilizada quando não existe associação a um componente específico de uma página. É muito útil para criar recursos para serem compartilhados por todo o aplicativo (uma mensagem de erro, por exemplo).

Criando um projeto localizado implicitamente

Para deixar claro o conceito de localização implícita, vamos criar um aplicativo ASP.NET 2.0, utilizando o idioma Português (pt-BR) como base do aplicativo (cultura neutra), Francês canadense (fr-CA) e Inglês canadense (en-CA).

No Visual Studio 2005, crie um novo Web Site chamado "SiteGlobal". Vou utilizar a linguagem C#, mas a conversão para VB.NET será muito simples, uma vez que no framework 2.0 a localização implícita exige muitíssimo pouco código.

Abra a página default.aspx (caso esteja em Source Mode, mude para Design Mode), adicione e configure os controles conforme a Tabela 2, ajustando os controles conforme a Figura 1.

ControleNomePropriedadeValor

Label

lblTitulo

Text

Bem-vindos ao Site Global

DropDownList

ddlCultura

AutoPostBack

True

 

 

Items

TextValue

Português
Francês
Inglês

pt-BR
fr-CA
en-CA

Label

Label1

Text

Cultura:

Label

lblCultura

Text

 

Button

btnMensagem

Text

Mensagem

Tabela 2. Controles a serem adicionados à página Default.aspx


Figura 1. Página do Site Global

Uma vez concluída a definição da página, seu arquivo de recursos deverá ser criado. Abra a página em design mode (conforme Figura 1) e selecione o item Generate Local Resource no menu Tools (Figura 2). Observe que esse item de menu estará acessível apenas se a página a ser localizada estiver aberta em Design Mode.


Figura 2. Menu Generate Local Resource

Uma vez concluído esse processo, note que foi criada uma nova pasta chamada App_LocalResources, contendo um novo arquivo chamado Default.aspx.resx (Figura 3).


Figura 3. Menu Generate Local Resource

O arquivo Default.aspx.resx é o arquivo que irá conter o texto de todos os componentes da página na cultura neutra (nesse caso o português). Alguns componentes vão possuir mais de uma ocorrência (linha) neste arquivo, um para cada propriedade passível de tradução. Exemplo: O componente Label possuirá ocorrências para duas propriedades (Text e Tooltip).

Para visualizar o conteúdo do arquivo Default.aspx.resx, dê um duplo clique sobre ele no Solution Explorer. Uma tela similar à apresentada na Tabela 3 deverá ser apresentada. Note que algumas propriedades são disponibilizadas para localização, mesmo que não requisitado.

NomeValor

btnMensagemResource1.Text

Mensagem

btnMensagemResource1.ToolTip

 

DropDownList1Resource1.ToolTip

 

Label1Resource1.Text

Cultura:

Label1Resource1.ToolTip

 

lblCulturaResource1.Text

 

lblCulturaResource1.ToolTip

 

lblTituloResource1.Text

Bem vindos ao Site Global

lblTituloResource1.ToolTip

 

ListItemResource1.Text

Português

ListItemResource1.Value

pt-BR

ListItemResource2.Text

Francês

ListItemResource2.Value

fr-CA

ListItemResource3.Text

Inglês

ListItemResource3.Value

en-CA

PageResource1.Title

Untitled Page

Tabela 3. Conteúdo do arquivo de recursos gerado (Default.aspx.resx)

Abra a página Default.aspx em Source Mode e note que todos os componentes da página receberam um novo atributo (meta:resourcekey). O valor configurado para esse atributo é o "elo de ligação" entre o valor do componente a ser traduzido e o arquivo de recurso. Veja o trecho de código da página na Listagem 1.

Listagem 1. Componentes da página Default.aspx com o atributo meta:resourcekey

<asp:Label ID="lblCultura" runat="server" 
meta:resourcekey="lblCulturaResource1" Width="137px">
</asp:Label>

<asp:Button ID="btnMensagem" runat="server" OnClick="btnMensagem_Click"
Text="Mensagem" meta:resourcekey="btnMensagemResource1" />

Observe que os atributos Culture e UICulture foram adicionados à diretiva Page (veja a Listagem 2) pelo comando Generate Local Resources. Eles serão os responsáveis em fazer com que a página seja automaticamente ajustada ao idioma configurado no browser do cliente (recebido através do header Accept-language). Para ter acesso à diretiva Page, você precisa abrir a página em modo source (verificar o código HTML da página).

Listagem 2. Diretiva Page da página Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs"
Inherits="_Default" Culture="auto" meta:resourcekey="PageResource1" 
UICulture="auto" %>

O próximo passo é criar os arquivos de recurso (um para cada idioma). Para isso, siga os seguintes passos:

1.

No Solution Explorer, selecione o arquivo Default.aspx.resx (arquivo de recurso);

2.

Copie e cole o arquivo usando Ctrl+C e Ctrl+V. Com isso, um novo arquivo será criado com o nome Copy of Default.aspx.resx.

3.

Agora é o momento de associar a cultura desejada ao arquivo, isso é feito com base no nome do mesmo. Crie primeiro o arquivo para a cultura "fr-CA" (Francês do Canadá). Para isso, renomeie o arquivo copiado para Default.aspx.fr-CA.resx (clique com o botão direito sobre o arquivo e selecione Rename, ou tecle F2).

4.

Abra o arquivo de recurso renomeado e configure os valores conforme a Tabela 4.

NameValor

btnMensagemResource1.Text

Message

Label1Resource1.Text

Culture:

lblTituloResource1.Text

Bienvenue pour site global

ListItemResource1.Text

Portugais

ListItemResource1.Value

pt-BR

ListItemResource2.Text

Français

ListItemResource2.Value

fr-CA

ListItemResource3.Text

Anglais

ListItemResource3.Value

en-CA

PageResource1.Title

Untitled Page

Repita os passos anteriores (1 - 4) para a cultura inglês canadense (utilizando en-CA ao invés de fr-CA no item 3), utilizando os dados da Tabela 5.

NameValor

btnMensagemResource1.Text

Message

Label1Resource1.Text

Culture:

lblTituloResource1.Text

Welcome to Site Global

ListItemResource1.Text

Portuguese

ListItemResource1.Value

pt-BR

ListItemResource2.Text

French

ListItemResource2.Value

fr-CA

ListItemResource3.Text

English

ListItemResource3.Value

en-CA

PageResource1.Title

Untitled Page

Tabela 5. Conteúdo do arquivo de recursos Default.aspx.en-CA.resx

Note que não haverá um arquivo de recurso específico para o português (pt-BR). Isso porque o arquivo default (Default.aspx.resx) já está todo em português e será utilizado como Cultura Neutra (vide o quadro Cultura Neutra).

Cultura Neutra

Cultura Neutra significa que, caso o idioma do cliente não possuir arquivos de recurso no aplicativo, esse idioma será utilizado. No aplicativo apresentado, caso o idioma configurado no browser do cliente não seja nenhum dos dois idiomas específicos definidos pelo aplicativo (fr-CA ou en-CA), o idioma apresentado será português (pt-BR). Note que o idioma da Cultura Neutra não precisa possuir um arquivo de recurso específico (algo como Default.aspx.pt-BR.resx no nosso exemplo), pois no caso do cliente não ser fr-CA nem en-CA, o idioma a ser utilizado será o neutro, onde o texto está escrito em português.

Pronto! Podemos dizer que o aplicativo já está preparado para funcionar em mais de um idioma. A página será apresentada de acordo com o idioma configurado no browser do cliente. Note que nenhuma linha de código foi escrita até agora!!! Para testar como ficaria o site em outro idioma, siga os passos indicados a seguir.

Testando o projeto utilizando localização implícita

1.

Altere a configuração do browser para um dos idiomas selecionados no aplicativo (pt-BR, fr-CA ou en-CA). Caso esteja utilizando o Internet Explorer, selecione Opções da Internet no menu Ferramentas. Na Tab Geral, clique no botão Idiomas. Clique no botão Adicionar e adicione as culturas utilizadas no aplicativo;

2.

Altere a ordem em que as culturas aparecem na lista, colocando por exemplo en-CA em primeiro lugar. Clique em OK e OK novamente;

3.

Execute o aplicativo e veja que a página irá trabalhar com o idioma Inglês;

4.

Altere novamente a ordem em que as culturas aparecem na lista, porém agora colocando fr-CA em primeiro lugar;

5.

Execute o aplicativo e veja que a página irá trabalhar com o idioma Francês;

6.

Um teste interessante. Abra o seu browser e adicione um idioma diferente dos utilizados pelo aplicativo (es-ES, por exemplo).

7.

Execute o aplicativo e note que o idioma apresentado é português), mas a cultura apresentada na linha "Cultura:" será "es-ES". Isso demonstra que uma vez que o idioma selecionado não possua um arquivo de recursos equivalente, mesmo que internamente o aplicativo esteja trabalhando com essa cultura (no exemplo es-ES), os recursos do idioma utilizados será o da Cultura Neutra (pt-BR nesse caso).

Alterando o idioma via código

O aplicativo já está funcionando, porém a label lblCultura não tem funcionalidade ainda e se você alterar o idioma no DropDownList, notará que ele também não está funcionando, isso é, mudando o idioma no ddlCultura, não altera o idioma na página. Ele não está funcionando porque apenas configuramos nosso aplicativo para detectar o idioma cliente automaticamente, mas não programamos nada em resposta a uma seleção no ddlCultura, para que o idioma mude. Para isso, algumas linhas de código precisam ser escritas.

A idéia é fazer com que ao mudar o item do DropDownList, a página se ajuste à cultura selecionada, utilizando os dados do arquivo de recurso do idioma selecionado.

Para que essa funcionalidade seja implementada, precisamos de muito pouco código. Primeiramente, precisamos fazer um override no método InitializeCulture. Esse método é executado bem no início do ciclo de vida de um Web Form, antes mesmo dos componentes e propriedades serem criados para uma página. Por isso, para detectar a cultura selecionada do componente ddlCultura, ao invés de se utilizar métodos como Click ou SelectedItemChanged, devemos obter os dados diretamente do request.

Abra o arquivo Default.aspx.cs (se você estiver com a página em design ou source mode aberta, basta pressionar a tecla F7) e adicione o código da Listagem 3, logo no início do arquivo, e o da Listagem 4 em qualquer lugar dentro da classe _Default (após o método Page_Load, por exemplo).

Listagem 3. Namespaces a serem adicionados ao projeto

using System.Threading;
using System.Globalization;

Listagem 4. Método InitializeCulture

protected override void InitializeCulture()
{
	string strUICulture = string.Empty;

	if (Request.Form["ddlCultura"] != null)
		strUICulture = Request.Form["ddlCultura"].ToString();
	else
		strUICulture = CultureInfo.CurrentCulture.Name.ToString();

	if (strUICulture != string.Empty)
	{
Thread.CurrentThread.CurrentUICulture = new
CultureInfo(strUICulture);
		Thread.CurrentThread.CurrentCulture =
CultureInfo.CreateSpecificCulture(strUICulture);
	}
	base.InitializeCulture();
}

Quando o aplicativo é executado, a configuração do idioma do cliente (configurada no browser) é obtida. Neste momento, é necessário sincronizar o idioma no DropDownList. Por isso, adicione o código da Listagem 5 ao método Page_Load da página Default.aspx. Como a atualização do DropDownList precisa ser feita somente quando o aplicativo é executado pela primeira vez (quando obtém o idioma configurado no browser do cliente), a propriedade SelectedValue é executada somente quando não se tratar de um PostBack. Já a atualização do lblCultura é sempre atualizada (fora do "!IsPostback").

Listagem 5. Atualizando os controles no Page_Load

protected void Page_Load(object sender, EventArgs e)
{
	if (!IsPostBack)
		ddlCultura.SelectedValue =
 			CultureInfo.CurrentCulture.Name.ToString();

	 lblCultura.Text = CultureInfo.CurrentCulture.Name.ToString();
 }

Pronto! Com essas poucas linhas de código, o DropDownList já está funcionando. Agora, quando o idioma é alterado no ddlCultura, todos os dados da página são ajustados para o idioma selecionado.

Localização explícita

Na localização explícita, ao contrário da implícita (que usa o atributo meta:resourcekey), não existe vínculo entre o texto e os componentes/propriedades. Seu uso é recomendado quando existe a necessidade de localização de um texto independente de formulário ou componente. Uma técnica que irá facilitar muito a nossa vida nesse sentido é a classe de recurso fortemente tipado (strongly typed class).

Você deve ter notado que o botão btnMensagem não tem funcionalidade nenhuma até agora, apenas tendo o seu texto alterado automaticamente quando um cultura diferente é selecionada (através de localização implícita). Adicionei esse botão desde o princípio do projeto não apenas para ilustrar essa funcionalidade, mas para utilizá-lo para implementar uma funcionalidade usando localização explícita.

Primeiramente crie um novo arquivo de recurso, que desta vez não será um arquivo de recurso local, mas global. Para isso, abra o Solution Explorer, clique com o botão direito sobre o nome do projeto e selecione Add New Item, conforme a Figura 4.


Figura 4. Adicionando um novo item (Resource File)

Selecione o template Resource File, mantenha o nome sugerido (Resource.resx) e clique no botão Add. Uma caixa de diálogo aparecerá (Figura 5) perguntando se deseja adicionar o novo arquivo de recurso na pasta padrão App_GlobalResources. Clique em Yes e note que a nova pasta é criada contendo o arquivo Resource.resx.


Figura 5. Caixa de diálogo questionando a criação da pasta de recursos globais

O editor do arquivo de recurso provavelmente já deve ter sido aberto automaticamente (caso não abra, dê um duplo clique no arquivo Resource.resx). Adicione os dados conforme a Tabela 6.

NameValorComment

Mensagem

Olá Mundo!

 

Tabela 6. Conteúdo do arquivo de recurso Resource.resx

Duplique o arquivo Resource.resx para os demais idiomas, do mesmo modo que fizemos no arquivos de recurso para localização implícita (copiar, colar e renomear). O conteúdo do arquivo Resource.fr-CA.resx deverá ter o conteúdo conforme a Tabela 7 e o arquivo Resource.en-CA.resx deverá ter o conteúdo conforme a Tabela 8.

NameValorComment

Mensagem

Bonjour Monde!

 

Tabela 7. Conteúdo do arquivo de recursos Resource.fr-CA.resx

NameValorComment

Mensagem

Hello World!

 

Tabela 8. Conteúdo do arquivo de recursos Resource.en-CA.resx

O Solution Explorer agora deverá estar parecido ao da Figura 6.


Figura 6. Resultado final do Solution Explorer

Abra a página Default.aspx em Design Mode e adicione um novo Label (altere a propriedade Name para lblMensagem) logo abaixo do botão btnMensagem, conforme a Figura 7.


Figura 7. Página Default.aspx com Label adicionada

Abra o arquivo de código Default.aspx.cs (ou apenas clique em F7, se você ainda estiver na página de design). Adicione o código da Listagem 6 no evento Click do botão btnMensagem. Note que ao digitar o ponto após a palavra Resources, o IntelliSense apresenta automaticamente as opções disponíveis, deixando bem claro tratar-se de uma classe fortemente tipada. Veja que todos os recursos que forem adicionados ao arquivo de recurso global serão apresentados. Como somente adicionamos o item "Mensagem", apenas esse estará disponível. No nosso caso, selecione Mensagem.

Listagem 6. Codificação do evento Click do botão btnMensagem

protected void btnMensagem_Click(object sender, EventArgs e)
{
	lblMensagem.Text = Resources.Resource.Mensagem.ToString();
}

Novamente podemos dizer, Pronto! Para entender exatamente o que fizemos nesse último passo, execute o aplicativo. Mude o idioma no DropDownList para francês e clique no botão btnMensagem. A mensagem "Bonjour Monde!" aparecerá. Isso é algo fantástico, pois estamos utilizando uma classe fortemente tipada, obtendo dados localizados.

Gostaria apenas de reforçar a diferença entre localização implícita e explícita com mais um exemplo: mude novamente o DropDownList e verifique que toda página é automaticamente ajustada ao idioma selecionado, exceto o lblMensagem. Isso porque não estamos utilizando o atributo "meta:resourcekey" (localização implícita). Para que o texto do lblMensagem seja localizado, clique novamente no botão btnMensagem e veja que o texto foi localizado corretamente.

Conclusões

Nesta breve demonstração de como localizar um Web Site no ASP.NET 2.0, pudemos notar o poder do recurso de localização/globalização e a simplicidade na sua utilização que o .NET Framework 2.0 coloca em nossas mãos. Existem muito mais recursos que podem ser apresentados neste tema, bastando dizer que somente citei a "Tradução" de um Web Site, porém podemos ir muito além disso, configurando também padrões regionais, mas isso fica para uma outra oportunidade.

Links

Definição da propriedade Name da classe CultureInfo

ISO 639 Language Codes

Build Developers - .Net User Group

Linha de código - Fonte rica de informação para desenvolvedores

Roberto Lopes (robertoctlopes@yahoo.ca) é Sr. Systems Analyst na empresa Direct Energy em Toronto/Canadá; foi durante vários anos instrutor de Visual Basic no Senac/SP e é certificado Microsoft .NET. Trabalha com plataforma Microsoft utilizando C#, ASP.NET, SQL Server, Oracle e BizTalk em projetos web, cliente/servidor e multicamadas. Também é responsável pelas tecnologias SQL Server, ASP.NET e Arquitetura no .NET user group Build Developers (www.builddevelopers.net).


 

©2014 Microsoft Corporation. Todos os direitos reservados. Entre em contato |Nota Legal |Marcas comerciais |Política de Privacidade
Microsoft