ASP.NET MVC – Globalizando aplicações (pt-BR)
Introdução
O ASP.NET MVC, assim como boa parte dos produtos da Microsoft, foi criado em Inglês (Novidade hein), e sendo assim, as vezes nos deparamos com mensagens que para nossos usuários (PT-BR) não são interessantes.
As validações com DataAnnotations são fáceis e simples de utilizar, mas na outra mão, temos suas mensagens de retorno, como “The field {1} is required.” e assim por diante.
Neste post, abordarei algumas soluções para globalizar aplicações ASP.NET MVC sem muito esforço.
Tudo começa no Web.Config
Globalizar uma aplicação na plataforma .NET começa pela adição da TAG Globalization no arquivo de configuração Web.Config.
Esta tag possui conhecidos parâmetros:
- Culture – Cultura da aplicação (PT, EU, US)
- uiCulture – Cultura da interface (PT-BR, EU, US)
- EnableClientBasedCulture - Obtém ou define um valor indicando se as propriedades Culture e UICulture devem se basear no valor do AcceptLanguage, que é enviado pelo cabeçalho do browser.
Esta propriedade deve ser definida entre as tags System.Web no arquivo Web.Config, conforme imagem abaixo.
http://andrebaltieri.files.wordpress.com/2011/12/image_thumb.png
Existem vários tutorias sobre como globalizar aplicações ASP.NET Web Forms, este é um bom exemplo: http://msdn.microsoft.com/en-us/library/bz9tc508.aspx.
Globalizando decimais
Nosso primeiro desafio é globalizar números decimais, que neste caso aceitam somente ponto “.” como casa decimal, e necessitamos de vírgula “,”.
A figura abaixo mostra o erro, onde é exibida uma mensagem mesmo o número estando correto (Para o padrão Brasileiro).
http://andrebaltieri.files.wordpress.com/2011/12/image_thumb1.png
Este erro pode ser contornado ao adicionar um JavaScript que extende os validation methods do jQuery, permitindo o uso de vírgula “,” ao invés de ponto “.”.
Infelizmente, o site de plugins do jQuery está fora, impossibilitando o download deste script: http://archive.plugins.jquery.com/node/8/release
Fique à vontade em baixar o arquivo do source no fim deste artigo.
http://andrebaltieri.files.wordpress.com/2011/12/image_thumb2.png
Com o arquivo “methods_pt.js” incluso na pasta Scripts da aplicação, é só fazer referência ao mesmo sempre que utilizar o jQuery Unnobstrutive, como nas páginas Create e Edit.
http://andrebaltieri.files.wordpress.com/2011/12/image_thumb3.png
Deste modo, já podemos utilizar decimais “abrasileirados”.
http://andrebaltieri.files.wordpress.com/2011/12/image_thumb4.png
Mas ainda temos o problema da mensagem em inglês, caso um valor com “.” seja digitado.
http://andrebaltieri.files.wordpress.com/2011/12/image_thumb5.png
Infelizmente, a única forma que encontrei para resolver este problema, foi mediante um regular expression, que só permite números.
http://andrebaltieri.files.wordpress.com/2011/12/image_thumb6.png
Deste modo, agora temos a mensagem agora está em portugês, como definida nas anotações da propriedade.
http://andrebaltieri.files.wordpress.com/2011/12/image_thumb7.png
Pronto, decimais globalizados!
Utilizando Resources com DataAnnotations
Em alguns casos, você pode querer utilizar os bones e velhos Resources, que são arquivos onde mapeamos mensagens a serem substituidas em tempo de execução, justamente para globalização de aplicações.
Para este exemplo criei um arquivo chamado DataAnnotations.resx na pasta App_GlobalResources da aplicação, e nele adicionei duas strings.
http://andrebaltieri.files.wordpress.com/2011/12/image_thumb8.png
A primeira chave, o “LidoDoResource” é uma palavra não reservada, que utilizarei para leitura nas anotações.
Já a palavra PropertyValueInvalid é uma palavra reservada, que toda vez que um valor inválido, para uma data por exemplo, for inserido, esta mensagem será retornada.
Então, no arquivo Global.asax, definimos um binder para que as requisições utilizem o Resource que criamos.
http://andrebaltieri.files.wordpress.com/2011/12/image_thumb9.png
Para utilizar os resources criados nas anotações, basta utilizar as propriedades ErrorMessageResourceName e ErrorMessageResourceType.
http://andrebaltieri.files.wordpress.com/2011/12/image_thumb10.png
O resultado é que agora ele lê a mensagem direto do Resource.
http://andrebaltieri.files.wordpress.com/2011/12/image_thumb11.pnghttp://andrebaltieri.files.wordpress.com/2011/12/image_thumb12.png
No caso do resource PropertyValueInvalid, este processo ocorre automaticamente.
http://andrebaltieri.files.wordpress.com/2011/12/image_thumb13.png
http://andrebaltieri.files.wordpress.com/2011/12/image_thumb14.png
Conclusão
Globalizar aplicações sempre desprenderá um esforço extra, porém temos alguns meios de minimizar isto, como mostrado neste post.
A questão dos decimais no ASP.NET MVC também é algo que irrita um pouco, mas como vimos pode ser facilmente contornado com um JavaScript.
Downloads
http://files.insidedotnet.com.br/IE7Tests.zip
Referências
Using MVC 3 with non-English Locales
http://blogs.msdn.com/b/rickandy/archive/2011/02/17/using-mvc-3-with-non-english-locales.aspx
How to: Set the Culture and UI Culture for ASP.NET Web Page Globalization
http://msdn.microsoft.com/en-us/library/bz9tc508.aspx
André Baltieri
MTAC - Microsoft Technical Audience Contributor
MSN: andrebaltieri@hotmail.com | Twitter:
@andrebaltieri
Blog: http://andrebaltieri.wordpress.com
Inside .NET Users Group Leader
http://www.insidedotnet.com.br/