MarinhoBrandão.com
"O risco que se corre ao se introduzir novas tecnologias é menor do que aquele que se corre ao não introduzi-las." ;)

O novo sistema de localizacão do Django

Publicado por marinho, há 1 ano, 8 meses | django

Esqueça tudo o que eu já falei e fiz sobre formatação de data e valores monetários no Django.

A solução veio tarde, mas está presente na versão 1.2. Não foi alardeada, mas é madura, funcional e melhor do que qualquer outra solução que eu já tenha visto. Mais uma vez os caras do core team acertaram na receita.

Para quem tomou medidas cautelosas e externas ao código específico como eu tomei, a migração é fácil e rápida, já aqueles que não gostaram da minha "gambiarra" e resolveram "no braço" vão ter um pouco mais de trabalho, mas o fato é que o novo sistema de localização é muito bom, e definitivo :)

Para começar, vamos esclarecer um ponto importante:

Internacionalização X Localização

http://www.marinhobrandao.com/media/uploads/gallery-file/localization-300x300.jpg

Você sabe a diferença [1] entre elas [3]? Pra entender, vamos pensar na diferença entre o significado de cada palavra.

“Internacionalização” remete a “internacionalizar” algo, neste caso um software. Isso quer dizer: torná-lo acessível para outras nacionalidades e idiomas. Um sistema internacional é um padrão reconhecido e compreendido por diversos países do globo. O famoso S.I. - Sistema Internacional de Medidas - por exemplo. Um software internacional é um software acessível por diversos países do globo, principalmente no aspecto do idioma.

“Localização” por sua vez, passa a impressão do mesmo significado, mas remete às particularidades de determinadas localidades. Um país como os EUA, Rússia, China ou Brasil, com superfície continental e culturas variadas, pode ter diversos padrões de formatação diferentes, um para cada localidade.

Apesar de o argumento valer também em ordem inversa (pois diversos países possuem mais de um idioma e padrões de formatação), os dois termos são usados no Django em direções opostas: a “internacionalização” generaliza o software, tornando termos únicos legíveis em vários idiomas através da tradução on-line desses termos. Já a “localização” torna determinadas informações especificas para cada localidade, respeitando o jeito de cada um.

O que há de novo

Os recursos de Internacionalização do Django [4] permanecem como estavam. É uma solução pioneira e vencedora, e as alterações foram apenas melhorias aqui ou ali. Mas agora entraram as novas funções de Localização [2], a começar pelas novas settings:

  • DATE_INPUT_FORMATS - determina uma tupla com os formatos aceitos para campos de data em formulários. O primeiro item da tupla será usado como default;
  • DATETIME_INPUT_FORMATS - determina uma tupla com os formatos aceitos para campos de data/hora em formulários. O primeiro item da tupla será usado como default;
  • DECIMAL_SEPARATOR - determina qual é o separador decimal para valores monetários (nos EUA o padrão é o ponto e no Brasil é uma vírgula);
  • FIRST_DAY_OF_WEEK - determina qual é o primeiro dia da semana (em alguns países o padrão é a segunda-feira - 1);
  • FORMAT_MODULE_PATH - determina o pacote em Python que contém os módulos para customização das demais settings desta lista. Isto é importante para mudar as configurações padrão e acredite: você vai precisar;
  • NUMBER_GROUPING - determina o intervalo de algarismos que deve-se usar um separador de milhar em valores monetários. Normalmente são 3;
  • SHORT_DATE_FORMAT - formato “curto” padrão para data em templates;
  • SHORT_DATETIME_FORMAT - formato “curto” padrão para data/hora em templates;
  • THOUSAND_SEPARATOR - caractere separador de milhar para valores monetários (nos EUA o padrão é uma vírgula e no Brasil é um ponto);
  • TIME_INPUT_FORMATS - determina uma tupla com os formatos aceitos para campos de hora em formulários. O primeiro item da tupla será usado como default;
  • USE_L10N - caso seja True, determina que o seu projeto habilite a localização (para sistemas brasileiros, é necessário, da mesma forma como o USE_I18N, mas para softwares estritamente americanos, pode ser False para tornar o projeto mais leve);
  • USE_THOUSAND_SEPARATOR - caso seja True, determina que o projeto deve formatar e aceitar valores monetários com separador de milhar.

Settings antigas, mas que eram praticamente ignoradas pelo Django em termos práticos, também foram corrigidas e adaptadas às novas funções. São elas:

  • DATE_FORMAT
  • DATETIME_FORMAT
  • TIME_FORMAT

Todas as três settings acima agora funcionam com o propósito que sempre alegaram em sua documentação, ou seja: são usadas para formatar data, data/hora e hora em templates.

Habilitando a Localização em seu projeto

A setting USE_L10N é desabilitada por padrão, e deve ser declarada no arquivo settings.py como True.

Somente isso é suficiente para que tudo funcione em 99%.

O padrão para datas ainda prioriza o formato “%Y-%m-%d“ acima do mais habitual “%d/%m/%Y“. Para corrigir isso você deve fazer os seguintes passos:

  1. Criar arquivos e pastas na seguinte estrutura:

    seu_projeto/
      formats/
        __init__.py
        pt_BR/
          __init__.py
          formats.py
    
  2. O arquivo “formats.py” deve conter o seguinte:

    DATE_INPUT_FORMATS = ('%d/%m/%Y', '%d/%m/%y', '%Y-%m-%d',)
    
  3. Definir a setting FORMAT_MODULE_PATH com o valor 'formats';

Feito isso, seus forms vão trabalhar naturalmente com o formato de data “dia/mês/ano”.

http://www.marinhobrandao.com/media/uploads/gallery-file/exemplo-localizacao.png

Agora use a sua criatividade para expandir o que vimos hoje de formas diferentes, e seja feliz com os novos recursos de localização do Django ;)