1 Objetivo

O propósito deste artigo é apresentar uma proposta de solução para que aplicações web suportem outras línguas, tais como: espanhol, inglês, etc. Também é objetivo deste documento guiar o processo de implementação da globalização, inclusive o processo de tradução.

2 Requerimentos de sistema

A solução proposta foi desenvolvida utilizando-se os softwares abaixo:
• .NET Framework 2.0.
• Visual Studio 2005 Team Suite.
• Microsoft Excel 2007.

3 Arquitetura da solução

3.1 Visão geral

A implementação da globalização será realizada utilizando-se arquivos de recursos locais (.resx) para cada uma das páginas. Desta forma, o trabalho em equipe pode ser facilitado, assim como o isolamento de possíveis bugs.
Na figura abaixo podemos identificar a utilização de arquivos de recursos locais para as páginas Default.aspx e Language.aspx nos idiomas português e inglês.
Os arquivos devem se nomeados utilizando o formato .aspx..resx. Note que os arquivos Default.aspx.resx e Language.aspx.resx não seguem este formato. Tais arquivos devem possuir o texto do idioma padrão da aplicação, pois toda vez que não for possível encontrar um arquivo de recurso local para o idioma preferido do usuário, estes serão utilizados.

ResxFiles - ResxFiles

O idioma a ser utilizado será obtido a partir das configurações do navegador.

BrowserLanguagePreferences - BrowserLanguagePreferences

Para obter tal resultado, devemos incluir a configuração destacada abaixo no web.config da aplicação:

<xml version="1.0"?>
<configuration>
	<appSettings/>
	<connectionStrings/>
	<system.web>
		<compilation debug="true"/>
		<authentication mode="Windows"/>
		<globalization culture="auto" uiCulture="auto"/>
	</system.web>
<configuration>

Em alternativa a uma configuração incorreta do browser ou a ausência de direitos para realizar tal configuração, as páginas deverão permitir que o usuário escolha o idioma preferido para visualizar as páginas. Tal escolha deverá ser gravada em um cookie, lida nas próximas visitas as páginas e deverá ter prioridade sobre as configurações do navegador.

O cookie pode ser gravado utilizando-se o código exemplo abaixo:

System.Web.HttpCookie cookie =
	new System.Web.HttpCookie("LanguagePreference", culture);
cookie.Domain="orchestratechnology.com.br";
cookie.Expires=System.DateTime.Now.AddDays(30);
this.Response.Cookies.Add(cookie);

A leitura do cookie e alteração do idioma corrente deverá ser realizada no evento Application_BeginRequest no arquivo Global.asax. Veja o exemplo abaixo:

void Application_BeginRequest(object sender, EventArgs e)
{
    System.Web.HttpCookie cookie =
	this.Request.Cookies["LanguagePreference"];
    if (cookie != null)
    {
        System.Threading.Thread.CurrentThread.CurrentUICulture =
	new System.Globalization.CultureInfo(cookie.Value, true);
    }
}

4 Procedimentos

4.1 Configuração para o idioma português

O primeiro passo para a implementação da globalização é criar a pasta App_LocalResources no projeto da aplicação web. Siga os passos:

• Clique com o botão direito do mouse no projeto web e escolha a opção “New Folder”. Em seguida, renomeie-a para App_LocalResources.

ProjectViewCreatingNewFolder - ProjectViewCreatingNewFolder

• Clique com o botão direito na pasta App_LocalResources e escolha a opção “Add New Item…”.

AppLocalResourcesFolderAddNewItem - AppLocalResourcesFolderAddNewItem

• Selecione o template “Resource File” e defina um nome para o arquivo de acordo com o formato .aspx.resx.

AddingDefault.aspx.resx - AddingDefault.aspx.resx

• Preencha o arquivo com os textos que deverão ser traduzidos. A coluna Name deverá ser preenchida de acordo com o formato .. Veja o exemplo abaixo:

FillingUpDefault.aspx.resx - FillingUpDefault.aspx.resx

• Edite a página com os atributos meta:resourcekey.


<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" meta:resourcekey="Page" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:LinkButton ID="lkbChangeLanguage" runat="server" OnClick="lkbChangeLanguage_Click" meta:resourcekey="lkbChangeLanguage"></asp:LinkButton>
        <br /><br />
        <asp:Label id="lblName" runat="server" meta:resourcekey="lblName"></asp:Label>
        <asp:TextBox id="txtName" meta:resourcekey="txtName" runat="server"></asp:TextBox>
        <br />
        <asp:Label id="lblSpecialty" runat="server" meta:resourcekey="lblSpecialty"></asp:Label>
        <asp:DropDownList id="ddlSpecialty" runat="server" meta:resourcekey="ddlSpecialty">
            <asp:ListItem meta:resourcekey="ListItem1"/>
            <asp:ListItem meta:resourcekey="ListItem2"/>
            <asp:ListItem meta:resourcekey="ListItem3"/>
            <asp:ListItem meta:resourcekey="ListItem4"/>
        </asp:DropDownList>
        <br />
        <asp:Label id="lblEmail" runat="server" meta:resourcekey="lblEmail"></asp:Label>
        <asp:TextBox id="txtEmail" runat="server" meta:resourcekey="txtEmail"></asp:TextBox>
        <br /><br />
        <asp:Button ID="btnInsert" runat="server" meta:resourcekey="btnInsert" />
    </div>
    </form>
</body>
</html>


4.2 Processo de tradução

Os passos descritos nesta seção foram desenhados para facilitar a interação entre o tradutor e o desenvolvedor.
Os exemplos contemplam apenas a tradução para o idioma inglês, pois para os demais o processo é o mesmo.

• Copie o arquivo Default.aspx.resx e cole na pastas App_LocalResources. Em seguida, altere o nome do novo arquivo para Default.aspx.en-us.resx.
• Selecione todos os textos do arquivo e cole em uma planilha Excel.

ResourceDataInExcel2007 - ResourceDataInExcel2007

• Trave todas as células da coluna A e destrave as da coluna B para que o tradutor não altere o ID.Property dos controles acidentalmente. Para isso, clique selecione as células da coluna, clique com o botão direito sobre a seleção e escolha Format Cells….

FormattingCells - FormattingCells

• Trave ou destrave as células selecionando o checkbox Locked.

LockingCells - LockingCells

• Proteja a planilha, clicando na aba Review e no botão Protect Sheet. Depois, informe uma senha e selecione os checkboxes de acordo com a figura abaixo:

ProtectingSheet - ProtectingSheet

• Envie a planilha para o tradutor.
• Quando a tradução estiver completa, exclua as linhas do arquivo de Default.aspx.en-us.resx e cole as linhas da planilha Excel.
• Repita os passos descritos acima para os demais idiomas.

5 Dica

Para facilitar a geração do arquivo de resource (.resx) para as páginas que já existem, é possível, a partir do modo design de visualização da página, utilizar a opção Generate Local Resource no menu Tools. Contudo, após a geração do arquivo será necessários normalizar os nomes dos controles.

Tip - Tip

6 Código-fonte

É possível baixar o código-fonte utilizado para a elaboração deste artigo no endereço http://www.orchestratechnology.com.br/blog/aspnet20/Globalization_20071109.zip.