ASP.NET Globalization com Masterpages

Olá pessoal, tudo bom?

Este post demonstra como implementar o versionamento de um site/sistema desenvolvido em ASP.NET para vários idiomas, tendo como característica principal a possibilidade do usuário indicar o língua desejada através de um controle posicionado na Masterpage da aplicação.

Neste post tomo a liberdade de escrever para DEVs com um pouco mais de experiência no assunto. Se esse não for seu caso e você esteja querendo aprender o básico sobre versionamento de aplicações ASP.NET, sugiro que assista a dois vídeos que gravei e onde demonstro os tópicos iniciais sobre o recurso Globalization do ASP.NET.

Para contextualizar melhor aquilo que pretendo explicar, peço que observe a imagem abaixo onde demonstro a interface de nossa aplicação teste:

globalization-masterpage-tela

Caso você tenha assistido aos vídeos indicados acima já deve estar sabendo que para versionar um webform ASP.NET é necessário que tenhamos arquivos de recurso (.RESX) contendo o conteúdo a ser alterado no momento da troca do idioma. Repare como eles estão organizados dentro da Solution Explorer de nosso exemplo:

globalization-masterpage-solution-explorerNa imagem ao lado podemos observar duas pastas contendo arquivos de recurso (.RESX). A primeira delas App_GlobalResources guarda os arquivos de recurso com frases a serem utilizadas através de nossa codificação em C#, ou seja, em momentos onde precisamos emitir uma mensagem de confirmação, uma mensagem de erro, etc.

A segunda, App_LocalResources, é criada a partir do momento em que utilizamos a opção do menu Tools -> Generate Local Resources. Nela estão contidos os arquivos de recurso gerados automaticamente para cada uma das páginas que desejamos versionar. Repare que em nosso caso temos a página Default.aspx e Pagina2.aspx para serem versionadas para o idioma Inglês (US).


Esse exemplo é composto por vários arquivos (download da solução), porém o que precisamos entender de fato é uma classe que criamos chamada de BasePage.cs. Essa classe tem por objetivo preparar o caminho para todas as demais páginas da aplicação que precisam ser versionadas.

Se você reparar bem irá perceber que a classe herda do namespace System.Web.UI.Page e por sua vez faz o override no método InitializeCulture() onde então fazemos a intervenção para identificar o idioma selecionado pelo usuário do “sistema” e o preparamos para o Globalization use as traduções existentes nos arquivos de recurso.

Abaixo temos o fonte da classe e os seus respectivos comentários:


using System.Globalization;
using System.Threading;
using System.Web.UI;

namespace GlobalizationMasterPage
{
  public class BasePage : Page //Herança do namespace System.Web.UI.Page
  {
    //Constante que identifica o nome atribuído ao DropDownList que permite a seleção do idioma na Masterpage.
    //A identificação desse nome pode ser realizada observando o código fonte do controle na página HTML renderizada pelo ASP.NET
    private const string idControleIdioma = "ctl00$ddlIdioma";

    //Realocação de código no método para que seja possível identificar o idioma a ser utilizado
    protected override void InitializeCulture()
    {
      if (Request["__EVENTTARGET"] != null) //Identifica o controle que disparou o postback
      {
        string idControle = Request["__EVENTTARGET"];
        if (idControle.Equals(idControleIdioma))
        {
          string idioma = Request.Form[idControle];
          TrocarIdima(idioma); //Ver código abaixo
        }
      }

      //Realizando a troca da "cultura" para a escolhida pelo usuário para o caso de já existir a indicação disso em uma sessão.
      if (Session["cultura"] != null)
      {
        Thread.CurrentThread.CurrentCulture = (CultureInfo)Session["cultura"];
        Thread.CurrentThread.CurrentUICulture = (CultureInfo)Session["cultura"];
      }
      base.InitializeCulture();
    }

    //Realiza a troca do idioma de acordo com a preferência do usuário
    private void TrocarIdima(string idioma)
    {
      Thread.CurrentThread.CurrentCulture = new CultureInfo(idioma);
      Thread.CurrentThread.CurrentUICulture = new CultureInfo(idioma);

      //Atualiza/cria a sessão para armazenar a escolha do idioma.
      Session["cultura"] = Thread.CurrentThread.CurrentCulture;
    }
  }
}

Tendo sido criada a classe BasePage.cs agora é só fazer suas páginas descenderem dessa nova classe ao invés de mantê-las em sua configuração original que é a herança do namespace System.Web.UI.Page. O diagrama abaixo ajuda a explicar melhor a situação:

myImage
myImage2

Dada a explicação, o próximo passo consiste apenas em trocar a herança original do webform de System.Web.UI.Page para BasePage.cs. Veja abaixo:


...
namespace GlobalizationMasterPage
{
  public partial class Default : BasePage
  {
    protected void Page_Load(object sender, EventArgs e)
    {

    }
  }
}

disketteDownload do exemplo completo

 

Dado o exemplo, agora é só derivar para sua realidade.

Grande abraço,
Eduardo Henrique Rizo

[twitter-follow screen_name=’eduardorizo’ show_count=’yes’]

Post relacionado: ASP.NET Globalization

Deixe um comentário