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:
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:
Na 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:
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) { } } }
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