Globalize sua aplicação, JÁ!

Publicado: 24/02/2006 em IntoSpaces

Olá pessoal como vão?
Estou correndo bastante ultimamente para entregar os inúmeros projetos que colocam sob minha resposabilidade, então escrever está um pouco difícil.

Mas como sempre adquirimos experiências em muitos projetos simultâneamente e hoje foi o dia da globalização das aplicações cair sobre minha cabeça.

Os problemas enfrentados foram os seguintes:

1 – Aplicação rodando em na máquina de desenvolvimento com o Windows XP Pro BR (odeio so em português).
O banco de dados, Sql Server 2005, fica em um servidor Windows Server 2003 En.
O servidor de produção é um Windows Server 2003 En.

O problema encontrado foi que registros gravados no servidor de produção e visualizados na máquina de desenvolvimento aparecia distorcida.
A data era algo do tipo 2/24/2006 03:45:22 PM e deveria ser exibida como 24/2/2006 15:45:22.
Mas isto não acontecia ela vinha assim 24/2/2006 03:45:22, uma verdadeira salada entre o formato americano e o brasileiro.

Certo, a solução é simples: Precisamos globalizar nossa aplicação web para o padrão pt-BR. Podemos fazer isto inserindo esta informação no web.config

<globalization culture="pt-BR" uiCulture="pt" requestEncoding="utf-8" responseEncoding="utf-8"/>

Mas nossos problemas não acabaram, só surtirá(surtiu) efeito nos registros inseridos após a modificação, o antigo continuava misto e totalmente errado 😦

2 – Aplicação rodando em servidor de desenvolvimento Windows XP Home En (ieeeeeeeeeh o melhor desktop de todos)
Banco de dados, Sql Server2005 em Windows Server 2003 BR (eca)
Aplicação rodando em produção num Windows Server 2003 BR (eeeeeeeca)

O problema agora foi mais grave, provém de um bug do ObjectDataSource do Asp.Net 2.0.
Ele força a utilização da cultura en-US o que ocasionou funcionamento perfeito de um gridview na máquina de desenvolvimento e erro em tempo de execução em produção.
O erro acontecia ao tentar atualizar os dados, a mensagem exibida diz que não é possível converter determinado campo string para DateTime.
De acordo com Keith Jackson em http://www.codecomments.com/ASP_.NET_Announcements/message788326.html
Existem 3 formas de superar este problema:
 1) Globalizar a aplicação para a cultura en-US
 2) Expor uma propriedade do tipo string que aponta para uma conversão interna do tipo DateTime
 3) Trabalhar no Handler do evento RowUpdating do GridView, fazendo a conversão do novo valor manualmente
  protected void GridView_RowUpdating(object sender, GridViewUpdateEventArgs e)
  {
    e.NewValues[19] = Convert.ToDateTime(e.NewValues[19].ToString());
    e.NewValues[20] = Convert.ToDateTime(e.NewValues[20].ToString());
  }

Eu escolhi a segunda opção, encapsulei meu atributo do tipo DateTime para uma propriedade publica como string e faço a conversão dos valores, agora tenho 2 propriedades que apontam para o mesmo atributo:

private DateTime date;

public DateTime Date
{
  
get { return date; }
  
set { date = value; }
}

public string SDate
{
  
get { return date.ToString(); }
  
set { date = DateTime.Parse(value); }
}

Problema resolvido!

Mora da história: Globalize sua aplicação para a cultura correta de imediato. Sua aplicação deve ser independente de SO, tomando este cuidado no início pode evitar catástrofes como perda de dados importantes por ficarem desorganizados no banco.
E cuidado com o ObjectDataSource este cara é terrível!!

[]’s
Shinji

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s