7

Mam dziwny problem z datą tłumaczeń w moim Ruby on Rails 3 aplikacji, a ja naprawdę nie rozumiem dlaczego ...Strange I18n data wyjścia z szynami

Oto moje en.yml i 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 

to nie jest specyficzne dla widoku particuliar, ale na przykład w jednym z moim zdaniem:

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

mam te dziwne wyjścia:

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

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

Skąd pochodzą te złe "formaty"?

Używam Rails 3.2.8 (z Postgresql/gem pg) i wszystko związane z I18n działa dobrze z wyjątkiem dat.

Dzięki za pomoc!

+0

Tak, mam zbyt ... (po aktualizacji) – Tricote

+0

Dane wyjściowe pasują do ciągów formatów dla czasu z wyjątkiem tego, że części łańcuchowe są przycinane do jednego znaku? Każdy pomysł skąd pochodzi 'o'? Jakie powinny być sformatowane wersje? –

+0

Niezupełnie, pojedynczy znak nie zawsze jest pierwszą literą miesiąca lub nazwą dnia.Na przykład: Pon, 01 października 2012 17:11:55 UTC +00: 00 zostanie przetłumaczone na: "01 n 2012 17:11:55" – Tricote

Odpowiedz

11

Chyba w końcu zorientowali się, to, przepraszam za tak długo trwa.

Pomocnik Railsy l po prostu dzwoni I18n.localize. Jeśli prześledzić za pomocą kodu I18n.localize, będziesz skończyć 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 

Więc localize pomocnik nie używa strftime dla „łańcuchowe” części datę/czas, próbuje zrobić to sam . Dodaj tłumaczenia (jako tablice w twoim YAML) dla nazw miesięcy i dni jak powyżej, a twoje zlokalizowane daty i godziny powinny zacząć działać.

Jeśli nie ma tych tablic translacji w swojej YAML, następnie I18n.t(:"date.abbr_month_names") dadzą Ci ciągi takie jak ten:

"translation missing: en.date.abbr_month_names" 

a następnie I18n.localize skończy się robi głupie rzeczy tak:

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

Spowoduje to użycie String#[] zamiast oczekiwanego Array#[], a otrzymasz losowo wyglądające nazwy jedno i dwuznakowe.

+3

Znalazłem problem dzięki twojej odpowiedzi! Rzeczywiście, miałem wszystkie pliki "date.abbr_day_names"/"date.abbr_month_names"/... w moich plikach tłumaczeniowych, ale nadpisałem klucz "date", aby przetłumaczyć słowo "date" (klucz globalny bez przestrzeni nazw)! Niezbyt mądry, wiem ... Dzięki za poświęcony czas! – Tricote

+0

"Dodaj tłumaczenia (jak tablice w twoim YAML) dla nazw miesięcy i dni jak powyżej, a twoje zlokalizowane daty i godziny powinny zacząć działać." Co? Gdzie? Przepraszam, nie rozumiem tego, czy ktoś mógłby podać przykład? –

+2

Wyjaśnione tutaj: http://stackoverflow.com/a/20839490/1417223 –