Este artigo discute:
| • | Definindo Culturas |
| • | Utilizando Resource Files |
| • | Características do Satellite Assemblies |
Antes do lançamento do ASP.NET, desenvolver sites para diversos idiomas era um trabalho repetitivo e complicado, em muitos casos o desenvolvedor tinha que criar páginas para cada idioma. Neste artigo iremos criar um site para diversas culturas e idiomas. A aplicação será um site para um hotel, onde os visitantes irão preencher um cadastro de reserva. Esse cadastro identificará qual a cultura do visitante e apresentará a tela no idioma correto. O site irá contemplar os idiomas português, inglês e alemão.
Para começarmos a falar de tradução de texto precisamos conhecer a diferença entre cultura e idioma. Existem países que falam a mesma língua, mas possuem diferentes culturas. Os Estados Unidos e a Inglaterra são exemplos de países que falam a mesma língua e possuem moedas e formatação de datas e números diferentes, enquanto que nos Estados Unidos a data 02/05/2005 é lida como 5 de fevereiro de 2005, essa mesma data na Inglaterra é lida como 2 de maio de 2005. A identificação da cultura segue o formato de dois caracteres para o idioma e mais dois caracteres para o local da cultura. No exemplo citado acima teríamos as seguintes culturas, “en-US” (United States) para os Estados Unidos e “en-GB” (Great Britain) para a Inglaterra. Para descobrimos a cultura do nosso visitante utilizamos o método abaixo:
‘VB.NET Request.UserLanguages(0) // C# Request.UserLanguages[0];
O método irá retornar qual o idioma e cultura do usuário. Os usuários do Brasil terão como retorno o idioma e a cultura “pt-BR”.
Satellite Assemblies são arquivos do tipo dll’s que têm como característica principal, a ausência de código executável. Esses arquivos possuem somente textos, imagens ou outras informações referentes à cultura. A quantidade de Satellite Assemblies em um projeto depende diretamente da quantidade de culturas suportadas pela aplicação, sendo que cada arquivo só pode conter uma cultura.
Crie um projeto ASP.NET Web Application chamado Hotel e crie um form chamado ficha.aspx, inserindo o código abaixo no formulário.
<%@ Page Language=”vb” AutoEventWireup=”false” Codebehind=”Ficha. aspx.vb” Inherits=”Hotel.Ficha”%> <!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN”> <HTML> <HEAD> <title>Hotel .NET</title> </HEAD> <body> <form id=”Form1” method=”post” runat=”server”> <P><asp:Label id=”lblNome” runat=”server”></asp:Label> <asp:TextBox id=”txbNome” runat=”server”></asp:TextBox> </P> <P><asp:Label id=”lblTelefone” runat=”server”></asp:Label> <asp:TextBox id=”txtTelefone” runat=”server” MaxLength=”70”></asp:TextBox></P> <P><asp:Label id=”lblNumeroPessoas” runat=”server”> </asp:Label> <asp:TextBox id=”txtNumPessoas” runat=”server” MaxLength=”70”></asp:TextBox></P> <P><asp:Label id=”lblObservaçao” runat=”server”> </asp:Label> <P><asp:Button id=”btnConfirmar” runat=”server”></asp:Button></P> </form> </body> </HTML>
O próximo passo é a criação dos arquivos onde ficarão armazenados os textos, imagens e demais objetos utilizados pela nossa aplicação, esses arquivos são denominados de Resource Files e são classificados em três tipos.
| • | FallBack é utilizado para a cultura padrão ou neutra, sempre que o usuário acessar uma aplicação e a cultura dele não for encontrada ou especificada, esse é o arquivo que será utilizado. Arquivos do tipo FallBack são compilados junto com a aplicação; |
| • | Language Specific é utilizado quando se deseja determinar a língua a ser exibida, mas não deseja especificar a cultura. Arquivos do tipo Language Specific são compilados em dll’s separadas “Satellite Assemblies”; |
| • | Culture Specific é utilizado para arquivos que possuem uma cultura definida, e assim como o Language Specific também são compilados em dll’s seraparadas. |
Para criar arquivos Resource Files, no Solution Explorer, clique em File e Add New Item, selecionando na lista de templates o tipo Assembly Resource File, crie com o nome de ficha.resx (Figura 1).

Figura 1. Criando um Resource File
A próxima etapa é preencher o arquivo.resx com as informações a serem exibidas na página. A primeira coluna a ser preenchida é name, que é uma chave de identificação para associação com o webcontrol da página.
Neste exemplo, o padrão utilizado foi {nome do form}.{nome do webcontrol} (Figura 2) e sempre em letras minúsculas para evitar erros, pois o campo é case sensitive. Para o primeiro WebControl utilize o name ficha.lblnome. No campo Value digite o conteúdo que vai aparecer na tela do usuário.
Até o momento criamos somente o Assemblie em Português (Neutro). Para criarmos em outros idiomas repita os passos acima especificando a língua ou a cultura no nome. Assim, o arquivo para inglês deverá ser nomeado como Textos.en.resx (Figura 3), o arquivo para inglês britânico é Textos.en-GB.resx e o arquivo para alemão é Textos.de.resx (Figura 4).
Propositalmente eu adicionei dois arquivos da língua inglesa, um para usuários de qualquer país que fale inglês, e outro somente para países de cultura Inglesa “en-GB”. Os usuários que não possuem cultura definida ou que possuam cultura que não tenhamos criado um arquivo, serão direcionados a utilizar a cultura padrão, também conhecida como “Neutra”. No exemplo não desenvolvemos um arquivo para o idioma espanhol, quando um usuário dessa cultura acessar a página ele utilizará a cultura padrão.
Para que o .Net utilize o conteúdo inserido nos Resource Files, deve-se associá-los aos WebControls da página criando-se uma instância da Classe ResourceManager. A classe ResourceManager é membro do Namespace System.Resources.

Figura 2. Arquivo para a cultura padrão

Figura 3. Arquivo para o idioma Inglês Americano
‘VB.NET Protected Textos As New ResourceManager(“Hotel.Textos”, _ GetType(Ficha).Assembly) // C# protected ResourceManager Textos = new ResourceManager(“Hotel.Textos”, typeof(Ficha).Assembly);
Em seguida informe à “Thread Corrente” qual a cultura do usuário que está acessando a página. O .NET irá selecionar qual o arquivo “Textos.xx-YY.resx” a ser utilizado. Para finalizar atribua aos WebControls as chaves definidas no Resource Files, como vemos no código abaixo:
‘VB.NET
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
If Not IsPostBack Then
Dim Idioma As String = Request.UserLanguages(0)
Thread.CurrentThread.CurrentCulture =
CultureInfo.CreateSpeci ficCulture(Idioma)
Thread.CurrentThread.CurrentUICulture = New
CultureInfo(Idioma)
lblNome.Text = Texto.GetString(“ficha.lblnome”)
lblTelefone.Text = Texto.GetString(“ficha.lbltelefone”)
lblNumeroPessoas.Text = Texto.GetString(“ficha.
lblnumeropessoas”)
btnConfirmar.Text = Texto.GetString(“ficha.btnConfirmar”)
End If
End Sub
// C#
private void Page_Load(object sender, System.EventArgs e)
{ if (!Page.IsPostBack)
{
string Idioma = Request.UserLanguages(0);
Thread.CurrentThread.CurrentCulture =
CultureInfo.CreateSp ecificCulture(Idioma);
Thread.CurrentThread.CurrentUICulture = New
CultureInfo(Idioma);
lblNome.Text = Texto.GetString(“ficha.lblnome”);
lblTelefone.Text = Texto.GetString(“ficha.lbltelefone”);
lblNumeroPessoas.Text = Texto.GetString(
“ficha.lblnumeropessoas”);
btnConfirmar.Text = Texto.GetString(“ficha.btnconfirmar”);
}
}
O .Net utiliza o método de distribuição conhecido como Hub and Spoke. Esse método é dividido em dois módulos. O primeiro é chamado de HUB e contém os códigos executáveis e as informações da cultura neutra “FallBack” da aplicação. O segundo módulo, conhecido como SPOKE, são as outras culturas e línguas que são utilizadas pela aplicação.
Quando a aplicação é compilada os arquivosdo módulo SPOKE, que seguem a nomenclatura {aplicação.resources.dll}, são copiados em pastas separadas para cada cultura e língua dentro do diretório bin, essas pastas devem ser nomeadas no padrão “xx-YY”, onde o xx representa a língua e YY representa a cultura (Figura 5). Com esse método de distribuição não há necessidade de recompilar toda a aplicação e envia-lá novamente para o cliente toda vez que uma nova língua ou cultura for adicionada, basta copiar através de xcopy nos diretórios abaixo do bin os arquivos e pastas.
Neste artigo conhecemos como utilizar o recurso de Satellite Assemblies. Com os exemplos e conceitos apresentados aqui, você poderá desenvolver suas aplicações para diversos idiomas e culturas de forma simples e transparente.

Figura 4. Arquivo para a cultura alemã

Figura 5. Pastas com Satellite Assemblies
Fábio Campinho (fcampinho@insix.com.br) é MCAD com 8 anos de experiência em desenvolvimento WEB e hoje é Diretor de TI da INSIX Soluções Inteligentes, e Leonardo Porto (lporto@insix.com.br) é pós-graduado em Sistemas de Informação com ênfase em Componentes Distribuídos e WEB, tem 5 anos de experiência em desenvolvimento WEB e hoje é Diretor de Desenvolvimento da INSIX Soluções Inteligentes.