Desenvolvimento - C#
Desenvolvendo Aplicações Multi-Idioma
Neste artigo será demonstrado como você poderá facilmente tornar sua aplicação multi-idioma sem fazer quase nada.
por Carlos CarmoMuitas vezes precisamos fazer com que nossa aplicação ou site esteja disponível em mais de um idioma para atender os usuários que irão utilizá-los. Neste artigo irei demonstrar como você poderá facilmente tornar sua aplicação multi-idioma sem fazer quase nada.
Estarei desenvolvendo esta unit test em Windows Forms.
Vamos lá. Comece criando um novo projeto como mostrado na figura abaixo.
Arraste um TextBox, um Button e um Label no form para podermos simular a alteração da cultura com um exemplo bem simples, porém prático. Arraste mais dois Buttons para que sejam os botões que trocarão o idioma da aplicação.
Agora, clique e selecione o form. Vá até a propriedade Localizable e altere seu valor para true. Fazendo isso, você poderá observar que o arquivo .resx (nesse caso Form1.resx) foi modificado e as propriedades dos controles da tela foram colocadas nele, para que, caso seja necessário, possamos alterá-las.
Altere os textos dos controles para algo que fique bem parecido com a figura abaixo.
Com a versão em português configurada, selecione o form novamente e altere a propriedade Language para English (United States). Altere as propriedades dos controles da tela de forma que a aplicação seja traduzida.
Se você acessar o Solution Explorer, poderá verificar que foi criado um novo arquivo atrelado ao seu form. Esse arquivo de resource possui todas as propriedades alteradas para a nova cultura que você adicionou no seu formulário.
Com os arquivos de resources criados, vamos à parte que interessa. Adicione uma nova classe no projeto com o nome Idioma. Nessa classe iremos colocar o código que fará a “mágica” necessária para a troca do idioma.
Para realizarmos a troca do idioma, teremos que primeiramente alterar a cultura da aplicação e depois iremos varrer o form alterando as propriedades dos controles.
private static void AlteraThreadIdioma(string culture)
{
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(culture, true);
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(culture, true);
}
O método acima altera a cultura da aplicação enquanto o método abaixo varre os controles alterando suas propriedades.
private static void AlteraCultura(Form frm, System.ComponentModel.ComponentResourceManager resx)
{
//Altera o nome do form
frm.Text = resx.GetObject("$this.Text", System.Threading.Thread.CurrentThread.CurrentCulture).ToString();
//Varre os controles do form aplicando a nova cultura
foreach (Control ctrl in frm.Controls)
resx.ApplyResources(ctrl, ctrl.Name, System.Threading.Thread.CurrentThread.CurrentCulture);
}
Com esses métodos criados, vamos criar um método público que irá chamar esses dois métodos e especificar qual será o arquivo de resource utilizado para buscar as propriedades dos controles.
public static void AjustaCultura(Form frm, string culture)
{
AlteraThreadIdioma(culture);
System.ComponentModel.ComponentResourceManager resx = new System.ComponentModel.ComponentResourceManager(frm.GetType());
AlteraCultura(frm, resx);
}
Com a classe Idioma criada, vamos utilizá-la no form para que ele seja traduzido. Adicione o código abaixo no click dos botões “Português” e “Inglês”.
private void btnPortugues_Click(object sender, EventArgs e)
{
Idioma.AjustaCultura(this, "pt-BR");
}
private void btnIngles_Click(object sender, EventArgs e)
{
Idioma.AjustaCultura(this, "en-US");
}
Compile o projeto, execute-o e clique nos botões “Português“ e “Inglês”. Você poderá observar que o formulário está sendo traduzido. E sem fazer grandes esforços.
A tradução dos controles foi extremamente fácil de ser feita. Agora, vamos traduzir também as eventuais mensagens que nossa aplicação exiba. Para isto, crie dois arquivos .resx como mostrado abaixo.
No resource Mensagens, coloque a mensagem conforme abaixo:
E no resource Mensagens.en-US, coloque da seguinte forma:
Adicione o método abaixo na classe Idioma. Este método irá buscar no resource de mensagem da cultura da aplicação a mensagem a ser exibida.
public static string RetornaMensagem(string NomeMensagem)
{
System.Resources.ResourceManager resx = new System.Resources.ResourceManager(typeof(Mensagens));
return resx.GetString(NomeMensagem, System.Threading.Thread.CurrentThread.CurrentCulture);
}
No evento click do botão “Exibir”, adicione o código abaixo.
private void btnExibir_Click(object sender, EventArgs e)
{
MessageBox.Show(Idioma.RetornaMensagem("OlaMundo") + txtNome.Text.Trim());
}
Compile e execute a aplicação. Observe que trocando de cultura e clicando no botão “Exibir”, a mensagem disparada pela aplicação também é traduzida.
Para aplicações que já estão desenvolvidas, a alteração dessas mensagens dos sistemas pode ser um pouco trabalhosa, porém se isso for estruturado no início, não haverá maiores problemas em tornar a sua aplicação multi-idioma.