У моєї програми Ruby On Rails 3 у мене дивна проблема з перекладами дат, і я дійсно не розумію, чому ...
Ось мої en.yml
і 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
Це не характерно для окремого перегляду, але, наприклад, для одного з моїх поглядів:
<td><%=l job_application.created_at, :format => :default %></td>
Я отримую ці дивні результати:
With locale = :en
=> t, 30 o 2012 18:09:33 +0000
With locale = :fr
=> 30 o 2012 18:09:33
Звідки беруться ці неправильні "формати"?
Я використовую Rails 3.2.8 (з Postgresql / gem pg) та все, що стосується I18n, працює чудово, крім дати.
Дякую за будь-яку допомогу!
Відповіді:
11 за відповідь № 1Я думаю, що я нарешті зрозумів це, вибачте за те, що зайняв так довго.
Рейки l
помічник просто дзвонить I18n.localize
. Якщо простежити через I18n.localize
код, ви закінчите тут:
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
Так що localize
помічник не використовує strftime
для "строгих" частин дати / часу, ценамагається зробити це сам. Додайте переклади (як масиви у вашій YAML) для назв місяця та дня, як зазначено вище, і ваші локалізовані дати та час повинні почати працювати.
Якщо у вас немає цих масивів перекладу у вашій YAML, тоді I18n.t(:"date.abbr_month_names")
дасть вам такі рядки:
"translation missing: en.date.abbr_month_names"
і потім I18n.localize
нарешті робити такі дурні речі:
"translation missing: en.date.abbr_month_names"[10]
Це буде використовувати String#[]
замість очікуваного Array#[]
і в кінцевому підсумку ви знайдете випадкові імена місячних та днів поодиноких символів.
1 для відповіді № 2
Звідки беруться ці неправильні "формати"?
Оскільки created_at
є DateTime, використовуючи рейки time
формати (не date
)
https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/en.yml#L195
time:
am: am
formats:
default: ! "%a, %d %b %Y %H:%M:%S %z"