Globalização - Lendo resources automaticamente

 

No artigo anterior falamos sobre globalização e internacionalização de um sistema web especificamente, para quem não teve a oportunidade de ler o artigo vou fazer uma revisão rápida.

 

Lembrando...

O conceito de globalização esta disponível no ASP.NET desde sua primeira versão, onde podíamos criar arquivos conhecidos como “resources” que armazenassem os textos entre outros recursos que pudessem variar conforme a cultura do usuário do sistema. No ASP.NET 2.0 este recurso foi melhorado e ao meu ver foram feitas implementações significativas para nós desenvolvedores, são elas:

 

Auto detecção

É possível configurar para que uma ou todas as páginas de nossa aplicação detecte automaticamente qual a cultura do usuário corrente, este recurso utiliza as configurações do browser.

Associação de resource por objeto

É possível criar arquivos resource específicos por objetos, entendam por objetos (páginas,  User controls e Máster Pager)

Expressões concisas

É possível utilizar de expressões concisas para recuperar dados dos arquivos resources.

Tabela 1. Detalhamento de novos recursos.

 

Introdução

Agora que já foi feita uma breve revisão do artigo anterior podemos dar inicio ao assunto deste artigo. Como já foi mencionado é possível criar um arquivo resource local ou global, sendo que o local esta ligado diretamente a um objeto e o global não.

 

Os arquivos de resource locais podem ser gerados automaticamente como já foi explicado no artigo anterior LINK PARA O ARTIGO. O VS.NET gera as chaves a partir dos controles existentes na página, porém existem situações em que nós precisamos criar nossas próprias chaves e isso é possível tanto no arquivos locais quanto em arquivos globais.

 

Teoria

Então lhes faço uma pergunta.

Como recuperar chaves de um arquivo de resource local ou global em runtime? Lembrando que já falamos sobre carregar chaves através das novas expressões, porém este recurso não pode ser utilizado em runtime.

 

Bom, para tal tarefa tanto o namespace HTTPContext quanto o namespace TemplateControl (este namepasce é implementado na classe System.Web.UI.Page) fornecem recursos para nos auxiliar, como podemos ver nas imagens 01 e 02.

 

Nota: A associação de um arquivo resource a um objeto é feita a partir do nome do objeto, o arquivo resource deve ser nomeado da seguinte forma: [suapagina.extensao.cultura.resx] caso seja o arquivo da cultura padrão não é necessário a definição de uma cultura no nome do arquivo.

 

ddglolrautfig01.jpg 

Figura 1.  Utilização da classe HTTPContext para carregar arquivos resource.

 

ddglolrautfig02.jpg 

Figura 2.  Utilização da classe TemplateControl para carregar arquivos resource.

 

Como podemos ver nas imagens 01 e 02 ambos os namespaces expões dois métodos um para carregar resources locais e outro para carregar resources globais. Apesar do nome ser igual existem algumas diferenças na utilização destes métodos em cada um destes namespaces.

 

Utilização

Agora vamos por a mão na maça, primeiramente vou esclarecer a diferença para utilizar os métodos do namespace HTTPContext e TemplateControl.

 

HTTPContext

 

GetLocalResourceObject

Este método fornece dois overloads.

 

O primeiro é preciso fornecer o path virtual da página e o resourceKey.

 

O segundo overload é preciso fornecer os mesmos parâmetros já mencionados mais a cultura.

GetGlobalResourceObject

Este método fornece também dois overloads.

 

O primeiro é preciso fornecer o nome do arquivo resource e o resourceKey.

 

O segundo overload é preciso também fornecer os mesmos parâmetros já mencionados mais a cultura.

Tabela 2. Detalhamento dos métodos para carregar arquivos resource utilizando o namespace HTTPCntext.

 

Resources Locais

 

As listagens 01 e 02 ilustram a utilização do método GetLocalResourceObject.

 

HttpContext.GetLocalResourceObject("~/Default.aspx", "PageResource1.Title")

Listagem 1. Implementação do método GetLocalResourceObject.

 

System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo("en-US");

HttpContext.GetLocalResourceObject("~/Default.aspx", "PageResource1.Title", culture);

Listagem 2. Implementação do método GetLocalResourceObject com a definição de uma cultura.

 

Resources Globais

As listagem 03 e 04 ilustram a utilização do método GetGlobalResourceObject.

 

HttpContext.GetGlobalResourceObject("resource", "String1");

Listagem 3.  Implementação do método GetGlobalResourceObject

 

System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo("en-US");

HttpContext.GetGlobalResourceObject("resource", "String1", culture);

Listagem 4.  Implementação do método GetGlobalResourceObject com a definição de uma cultura.

 

Na listagem 01 e 03 quando não é definida uma cultura o Framework se encarrega de buscar o resource padrão mesmo que não as propriedades Culture e UICulture tenham sido definidas na página ou no web.config como auto.

 

Na listagem 02 e 04 quando é definida uma cultura na chamada do método GetLocalResourceObject é desconsiderada somente para o resourceKey especificado no método a cultura corrente, ou seja, se foi detectado que a cultura do usuário é pt-br e você precisa recuperar um resourceKey do arquivo especifico, por exemplo, da cultura en-us é possível. Caso a cultura corrente seja a mesma a qual você deseja carregar o resourceKey não é preciso definir uma cultura e pode-se utilizar o primeiro overload.

 

TemplateControl

 

GetLocalResourceObject

Este método fornece dois overloads.

 

O primeiro é preciso fornecer o resourceKey.

 

O segundo overload é preciso fornecer, além do resourceKey outros dois parâmetros os quais não tem relevância e podem ser definidos como null na chamada do método.

GetGlobalResourceObject

Este método fornece também dois overloads.

 

O primeiro é preciso fornecer o nome do arquivo resource e o resourceKey.

 

O segundo overload é preciso fornecer, além do nome e do resourceKey outros dois parâmetros os quais não tem relevância e podem ser definidos como null na chamada do método.

Tabela 2. Detalhamento dos métodos para carregar arquivos resource utilizando o namespace TemplateControl.

 

A listagem 05 ilustra a implementação dos métodos citados na tabela 03.

 

//Resource Local

this.GetLocalResourceObject("PageResource1.Title");

this.GetLocalResourceObject("PageResource1.Title", null, null);

 

//Resouce Global

this.GetGlobalResourceObject("resouce", "String1")

this.GetGlobalResourceObject("resouce", "String1", null, null);

Listagem 5. Implementação dos métodos para recuperar arquivos de resource.

 

Comparação

Tanto os métodos contidos no namespace HTTPContext como os métodos do namespace TemplateControl basicamente tem o mesmo objetivo, porém os métodos do namespace HTTPContext possibilitam a escolha do arquivo de resource a ser carregado a partir da definição da cultura, já os métodos do namespace TemplateControl carregam baseado na cultura do usuário corrente.

 

Referências:

http://msdn2.microsoft.com/en-us/library/ms153598.aspx

http://msdn2.microsoft.com/en-us/library/ms153593.aspx

 

Até o próximo artigo.

 

[]’s