7

Tengo un extraño problema con traducciones fecha en mi Ruby On Rails 3 aplicación, y la verdad es que no entiendo por qué ...I18n extraño salida fecha con los carriles

Aquí están mis en.yml y fr.yml:

fr: 
    date: 
    formats: 
     default: "%d/%m/%Y" 
     short: "%e %b" 
     long: "%e %B %Y" 
    time: 
    formats: 
     default: "%d %B %Y %H:%M:%S" 
     short: "%d %b %H:%M" 
     long: "%A %d %B %Y %H:%M" 
    am: 'am' 
    pm: 'pm' 



en: 
    date: 
    formats: 
     default: "%Y-%m-%d" 
     long: "%B %d, %Y" 
     short: "%b %d" 
    time: 
    am: am 
    formats: 
     default: ! '%a, %d %b %Y %H:%M:%S %z' 
     long: ! '%B %d, %Y %H:%M' 
     short: ! '%d %b %H:%M' 
    pm: pm 

Esto no es específico a una vista partícular, pero por ejemplo en uno de mi punto de vista:

<td><%=l job_application.created_at, :format => :default %></td> 

puedo obtener esos productos extraños:

With locale = :en 
=> t, 30 o 2012 18:09:33 +0000 

With locale = :fr 
=> 30 o 2012 18:09:33 

¿De dónde vienen estos "formatos" incorrectos?

Estoy usando Rails 3.2.8 (con Postgresql/gema pg), y todo lo relacionado con I18n funciona bien, excepto las fechas.

¡Gracias por cualquier ayuda!

+0

Sí, yo también ... (publicar actualización) – Tricote

+0

El resultado coincide con las cadenas de formato de veces, excepto que las partes de cadena se truncan en un carácter? ¿Alguna idea de dónde viene el 'o'? ¿Cuáles deberían ser las versiones formateadas? –

+0

Bueno, no exactamente, el carácter único no siempre es la primera letra del mes o el nombre del día.Por ejemplo: Lun, 01 Oct 2012 17:11:55 UTC +00: 00 se traducirá a: "01 n 2012 17:11:55" – Tricote

Respuesta

11

Creo que finalmente he cuenta de esto, lo siento por tardar tanto.

El ayudante de Rails l simplemente llama a I18n.localize. Si se desplaza a través del código I18n.localize, que va a terminar here:

format = format.to_s.gsub(/%[aAbBp]/) do |match| 
    case match 
    when '%a' then I18n.t(:"date.abbr_day_names",     :locale => locale, :format => format)[object.wday] 
    when '%A' then I18n.t(:"date.day_names",      :locale => locale, :format => format)[object.wday] 
    when '%b' then I18n.t(:"date.abbr_month_names",    :locale => locale, :format => format)[object.mon] 
    when '%B' then I18n.t(:"date.month_names",      :locale => locale, :format => format)[object.mon] 
    when '%p' then I18n.t(:"time.#{object.hour < 12 ? :am : :pm}", :locale => locale, :format => format) if object.respond_to? :hour 
    end 
end 

forma que el ayudante localize no utiliza strftime para las partes "fibrosas" de la fecha/hora, se trata de hacerlo por sí mismo . Agregue las traducciones (como matrices en su YAML) para los nombres de mes y día como se indica arriba y sus fechas y horas localizadas deberían comenzar a funcionar.

Si usted no tiene esas matrices de traducción en su YAML, a continuación, le dará el I18n.t(:"date.abbr_month_names") cadenas como esta:

"translation missing: en.date.abbr_month_names" 

y luego I18n.localize va a terminar haciendo cosas tontas como esta:

"translation missing: en.date.abbr_month_names"[10] 

Eso utilizará String#[] en lugar del esperado Array#[] y terminará con nombres de un solo carácter de un solo mes y día.

+3

¡He encontrado el problema gracias a tu respuesta! En realidad, tenía todas las claves "date.abbr_day_names"/"date.abbr_month_names"/... en mis archivos de traducción, pero había anulado la tecla "fecha" para traducir la palabra "fecha" (clave global sin espacio de nombres). No muy inteligente, lo sé ... ¡Gracias por tu tiempo! – Tricote

+0

"Agregue las traducciones (como matrices en su YAML) para los nombres de mes y día como se indicó anteriormente y sus fechas y horas localizadas deberían comenzar a funcionar." ¿Qué? ¿Dónde? Lo siento, no lo entiendo, ¿podría alguien dar un ejemplo, por favor? –

+2

Aclarado aquí: http://stackoverflow.com/a/20839490/1417223 –