7

ho uno strano problema con la data di traduzioni nel mio Ruby On Rails 3 applicazione, e io davvero non capisco perché ...Strano I18n data di uscita con le rotaie

Ecco la mia en.yml e 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 

Questo non è specifico per una vista particuliar, ma per esempio in uno dei mio punto di vista:

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

ottengo questi risultati strani:

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

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

Da dove vengono questi "formati" errati?

Sto usando Rails 3.2.8 (con Postgresql/gem pg), e tutto ciò che riguarda I18n funziona bene tranne per le date.

Grazie per qualsiasi aiuto!

+0

Sì, anch'io ... (post aggiornato) – Tricote

+0

L'output corrisponde alle stringhe di formato per le volte eccetto che le parti di stringa vengono troncate su un carattere? Qualche idea da dove viene il 'o'? Quali dovrebbero essere le versioni formattate? –

+0

Beh, non esattamente, il singolo carattere non è sempre la prima lettera del mese o il nome del giorno.Ad esempio: Lun, 01 Ott 2012 17:11:55 UTC +00: 00 sarà tradotto in: "01 n 2012 17:11:55" – Tricote

risposta

11

Penso di aver finalmente capito questo, mi dispiace per così tanto tempo.

L'helper Rails l chiama solo I18n.localize. Se si traccia attraverso il codice I18n.localize, vi ritroverete 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 

Così l'aiutante localize non usa strftime per le parti "filamentose" della data/ora, si cerca di farlo da solo . Aggiungi le traduzioni (come matrici nel tuo YAML) per i nomi del mese e del giorno come sopra e le date e gli orari localizzati dovrebbero iniziare a funzionare.

Se non si dispone di tali matrici di traduzione nella vostra YAML, poi I18n.t(:"date.abbr_month_names") vi darà le stringhe come questo:

"translation missing: en.date.abbr_month_names" 

e poi I18n.localize finirà per fare cose stupide come questa:

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

Questo utilizzerà String#[] invece del previsto Array#[] e si finirà con nomi di mese e giorno a carattere singolo.

+3

Ho trovato il problema grazie alla tua risposta! In realtà, avevo tutti i tasti "date.abbr_day_names"/"date.abbr_month_names"/... nei miei file di traduzione, ma avevo sovrascritto la chiave "date" per tradurre la parola "date" (chiave globale senza spazio dei nomi)! Non molto intelligente, lo so ... Grazie per il tuo tempo! – Tricote

+0

"Aggiungi le traduzioni (come array nel tuo YAML) per i nomi del mese e del giorno come sopra e le date e gli orari localizzati dovrebbero iniziare a funzionare." Che cosa? Dove? Mi dispiace di non averlo, qualcuno potrebbe fornire un esempio, per favore? –

+2

Chiarito qui: http://stackoverflow.com/a/20839490/1417223 –