/ / Дивний вихід дати I18n з рейками - рубін на рейках, рубін на рейках-3, дата, локалізація, інтернаціоналізація

Дивний випуск дати I18n з рельсами - ruby-on-rail, ruby-on-rail-3, дата, локалізація, інтернаціоналізація

У моєї програми 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"