terça-feira, 12 de fevereiro de 2008

Utilização de resources em ASP.NET

Provavelmente até já ouviu falar nos tais dos resources (vá lá! de certeza que leu o meu post anterior sobre localização...), mas exactamente o que são e para que servem? Quando terminar a leitura deste post, a sua vida vai mudar, já que por hoje me vou dedicar aos ditos cujos - como prometido - e ... "o prometido é devido" - como canta o Rui Veloso.

Uéu (=well em en-BR!!), os resource são um mecanismo, deveras simples, de gerir mensagens localizadas na aplicação. Dito de outra forma, é um mecanismo que permite armazenar as mensagens a usar na aplicação em várias línguas para labels, headers, botões, etc.

Uma vantagem na utilização de resources que se obtém por arrasto, é a valiosa capacidade de uniformizar as várias interfaces da aplicação. Lá dizem as boas práticas de programação que devemos desenhar as interfaces com o utilizador recorrendo a mecanismos que permitam uniformizar as várias interfaces humano-computador. A utilização de resources permite-nos dar mais um passo nesse sentido, uma vez que assim podemos, por exemplo, armazenar os textos que pretendermos usar em todos os botões da aplicação e desta forma acabaram-se os botões de gravar, salvar, inserir, etc espalhados pela aplicação e ainda por cima, todos com a mesma função(!): armazenar o/os registo/os num dispositivo qualquer de armazenamento.

Claro que a principal função prende-se com a facilidade de manutenção de uma aplicação multilingue. Desenha-se uma interface, criam-se múltiplos resources para cada língua e voilá!, a nossa aplicação passa a poder funcionar em várias línguas (veja também o meu post anterior).

Antes ainda de ver como usar os resources, há ainda a saber que existem 2 tipos de resources: localresources, que contém os dados relativos a uma página específica do site; globalresources que contém dados localizados que são válidos em todas as páginas do site.

Os resources são ficheiros XML com extensão resx que são armazenados nas pastas App_LocalResources ou App_GlobalResources consoante se destinam a uma única página ou a todo o site.

Neste artigo vou apenas falar nos globalresources por achar que são os mais interessantes.

Supondo que pretendemos criar resources para os botões da aplicação, no Visual Studio basta criar um novo ficheiro do tipo Resource file. Se o fizer na raiz do site o VS emite um aviso a alertar que vai colocar o resource na pasta app_globalresources (que é também criada caso não exista).

Grave o ficheiro com o nome botoes.resx. O VS oferece uma interface para edição deste tipo de ficheiros que basicamente apresenta uma tabela com 3 colunas sendo a primeira a coluna que nos permite inserir o nome do resource, a segunda coluna conterá a mensagem que deverá aparecer na aplicação e a terceira permite-nos guardar um comentário que ajuda a identificar o propósito da mensagem. Este ficheiro deve conter as mensagens na língua default do sistema. Eu costumo optar por escrever aqui todas as mensagens em inglês. Depois basta duplicar este ficheiro e alterar o nome para botoes.pt.resx. Este ficheiro deve conter os mesmos resources mas agora em português.


O golpe final consiste em associar aos objectos das páginas o resource correspondente. Crie um novo webform e adicione um botão. Nas propriedades do botão clique na opção Data/(Expressions) e altere a propriedade Text: na combobox Expression type, escolha Resources. Na classkey defina botoes (o nome do ficheiro resx criado atrás). Escolha na combobox ResourceKey o label que definiu para o botão.


Por vezes a combobox não é refrescada após a escolha da ClassKey, por isso depois de definir a Classkey clique numa qualquer propriedade na lista Bindable properties e depois volte a clicar em Text. Agora ao clicar na ResourceKey já deve ter uma combobox com os vários labels.


O label do botão deve apresentar agora o texto definido no resource file.

See ya!

sexta-feira, 1 de fevereiro de 2008

ASP.NET a falar português!

Eu diria, no mínimo, que é chato quando criamos um novo projecto ASP.NET as definições cultura nos presentearem sempre com datas no formato inglês. Vou-vos mostrar como podem facilmente alterar as definições de cultura do vosso site para que os vários controlos passem a mostrar a informação à "moda portuguesa".


Um dos controlos que particularmente me irrita é o Calendar, em especial o CalendarExtender do AJAX, que acho realmente bonito e funcional.


Como é hábito nestas coisas da programação, podemos obter os mesmo resultados de formas muito distintas. Acho particulamente útil as possibilidades de configuração via Web.config, já que passam a ser válidas em todas as páginas do site, se não andarmos com avarias em cada uma delas!


No bloco system.web, basta acrescentar o marcador globalization e definir as propriedades uiCulture e culture.




<system.web>

<globalization uiCulture="pt-PT" culture="pt-PT"/>





Ok, mas o é que distingue cada uma das propriedades? Simples, caro Watson, a propriedade culture determina o aspecto dos resultados de funções dependentes da cultura ao passo que uiCulture, determina quais os resources serão carregados na página.


E por falar em resources… será este o tema do meu próximo post. Aguardem!

Testar envio de mensagens de correio electrónico sem usar SMTP

Noutro dia vi-me numa situação interessante: queria testar o envio de mensagens de correio electrónico sem recorrer ao SMTP. Para testar se o código desenvolvido está a funcionar correctamente, é possível enviar todas as mensagens de teste para uma pasta no computador em vez de as enviar para uma caixa de correio real, isto poupa-nos muitos deletes!


A utilização é simples, primeiro há que mexer um bocadinho no web.config:




<system.net>

<mailSettings>

<smtp deliveryMethod="SpecifiedPickupDirectory">

<specifiedPickupDirectory pickupDirectoryLocation="c:\Lixo\" />

<smtp>

<mailSettings>

<system.net>



Depois, para o envio efectivo das mensagens basta no nosso código fazer qualquer coisa do tipo (nota: para simplificar o exemplo não estou a apresentar qualquer tipo de validações).



MailMessage msg = new MailMessage(txtDe.Text, txtPara.Text, txtAssunto.Text, txtMensagem.Text);

SmtpClient clienteDeCorreio = new SmtpClient();

clienteDeCorreio.Send(msg);



Reparem que estou a assumir que os controlos txtXPTO são todos do tipo TextBox.

Boas mensagens!