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