miércoles, septiembre 01, 2010

Localización de fechas en Rails

Al estar trabajando en un sitio/aplicación para un cliente bajo el CMS RefineryCMS, cambie el idioma de CMS a español, pero las fecha seguían apareciendo en formato en Inglés, ej: September 01, en lugar de 01 de Septiembre.

Aun y cuando ya tenia instalado el archivo es-MX.yml en el directorio locale y Rails estaba localizando otros textos pero no las fechas. En el archivo yml encontramos la siguiente estructura:

date:

order: [:day, :month, :year]

abbr_day_names: [Dom, Lun, Mar, Mie, Jue, Vie, Sab]

abbr_month_names: [~, Ene, Feb, Mar, Abr, May, Jun, Jul, Ago, Sep, Oct, Nov, Dic]

day_names: [Domingo, Lunes, Martes, Miércoles, Jueves, Viernes, Sábado]

month_names: [~, Enero, Febrero, Marzo, Abril, Mayo, Junio, Julio, Agosto, Septiembre, Octubre, Noviembre, Diciembre]

formats:

short: "%d de %b"

default: "%d/%m/%Y"

long: "%A, %d de %B de %Y"

formal: "%d de %B"

time:

formats:

short: "%d de %b a las %H:%M hrs"

default: "%a, %d de %b de %Y a las %H:%M:%S %Z"

long: "%A, %d de %B de %Y a las %I:%M %p"

am: "am"

pm: "pm"

En donde en Date:Formats:Formal encontramos "%d de %B, con lo que esperaria formatos de fecha 01 de Septiembre.

Resulta que con:

t (:formal, :scope => [:date, :formats])

podemos leer el formato "%d de %B del archivo de localización, pero ahora el problema es ¿como le indicamos a la fecha que formato usar?, bueno para eso usamos I18n, donde pasamos la fecha a formatear y el formato de acuerdo al idioma de la aplicación:

I18n::localize(date, :format => t (:formal, :scope => [:date, :formats]))

Ahora el único problema es que este código es bastante largo para colocarlo dentro de una vista, por lo que podemos mandarlo a un método helper de la siguiente forma:

def localize_short_date(date)

I18n::localize(date, :format => t (:formal, :scope => [:date, :formats]))

end

Con esto en nuestra vista solo llamamos:

<%= localize_short_date Date.now %>

Y nos aseguramos que la fecha es desplegada en el formato definido y localizada al idioma de la aplicación Rails.


2 comentarios:

Gunnar dijo...

O más fácil aún:

Date.now.to_s(:short)

Mario Alberto Chavez dijo...

Gunnar,

Por alguna extraña razon no me funciona con simplemente Date.now.to_s(:short), me formatea la fecha como :default y en :en