Fernando Luizão

Desenvolvimento de software e nerdices em geral

Deslocalizando datas e números usando o i18n do Rails

with 4 comments

NOTA: Antes de começar, se você não sabe o que é ou não tem uma noção básica sobre o i18n do Rails, leia esse guia.

Fazer conversões de datas e números localizados sempre foi uma tarefa chata em Rails (e em outras linguagens/frameworks também). O usuário digita uma data no formato brasileiro (por exemplo, dd/mm/yyyy), e o Ruby não consegue converter a data corretamente. A maneira mais usada por aí é criar atributos virtuais (ou mesmo sobrecrever o setter padrão do atributo) no model para fazer a conversão, por exemplo:

class Model < ActiveRecord::Base #recebe uma data no formato dd/mm/yyyy e converte para yyyy-mm-dd def data_vencimento=value self[:data_vencimento] = value.split("/").reverse.join("-") end end [/sourcecode] Isso funciona, mas quando eu usava isso não ficava satisfeito, queria algo mais "mágico" :). Perguntei no fórum RubyOnBr se não teria um jeito de fazer a conversão automaticamente, usando o próprio i18n do Rails. Então meu camarada Rafael Rosa chegou a uma solução, usando o formato padrão de data configurado no aquivo de i18n para fazer o parsing de datas. Eu acrescentei suporte à números, o Rafael organizou tudo, escreveu testes, e surgiu o i18n_localize_core.
O plugin funciona bem, consegue converter datas e números usando as configurações do arquivo de internacionalização. O plugin resolvia bem para mim, inclusive tinha feito alguns hacks no plugin para fazer a conversão nos text_fields, mas não coloquei no meu fork porque estava muito feio :D.
Só que a um tempo atrás, encontrei o plugin delocalize, escrito por Clemens Kofler, que faz basicamente a mesma coisa, mas melhor :). O i18n_localize_core é meio invasivo, sobrescreve os métodos Date#_parse, String#to_i e String#to_f. No delocalize, o Clemens sobrescreveu apenas onde era necessário, e ainda adicionou suporte à entrada de vários formatos de datas.
Usar o plugin é simples, como tudo na vida deve ser :). Tendo configurado seu arquivo de i18n e instalado o plugin, basta adicionar a chave :input no arquivo de i18n com os formatos de data que o usuário poderá digitar e sair pro abraço :). O plugin se encarrega de fazer o resto de forma transparente.

No README do plugin tem alguns exemplos de uso, dêem uma conferida no projeto:

http://github.com/clemens/delocalize

Advertisements

Written by fernandoluizao

June 18, 2009 at 12:50 am

Posted in Rails

Tagged with , , , , ,

4 Responses

Subscribe to comments with RSS.

  1. Muito bom ! =D

    Og Rafael

    June 22, 2009 at 12:59 pm

  2. […] Deslocalizando datas e números usando o i18n do Rails « Fernando Luizão (tags: rubyonrails) […]

  3. hum… estava procurando como fazer isso.
    quer dizer que o rails não faz sozinho… chato… ainda bem que tem o plugin! vlw!

    Rafael

    January 6, 2010 at 8:33 pm

  4. Esto me ha ayudado, y creo que es la solución ideal:

    gem ‘delocalize’

    https://github.com/clemens/delocalize

    configuras en el es.yml (o el que sea) el formato de salida para fechas y numeros, y la gema delocalize lo tiene en cuenta a la hora de convertir los tipos (type_cast de ActiveRecord Column). Además de que también lo aplica en el value de los input del form automáticamente.

    Samuel Vega Caballero

    July 11, 2011 at 1:05 pm


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: