[Несколько месяцев спустя ...]
Проблема в том, что вы пытаетесь определить формат «datetime» в en.yml, но код локализации Rails проверяет только «date» или «time» (объединяя «datetime» с «time»).
Код ошибки в базовом коде i18n здесь , в строке 53:
type = object.respond_to?(:sec) ? 'time' : 'date'
Проверяет, может ли данный объект ответить на «sec»; если это так, он читает материал "time" в en.yml, если нет, он читает формат "date". Нет даты и времени.
Как предложил Тираэль, вы можете заставить его подчиняться своей воле под дулом пистолета через код инициализации. Это, безусловно, сработает, но теперь вы поместили код локализации в ваши инициализаторы. Это потенциально запутанно и грязно, ИМО.
IMO, более чистый способ сделать это - добавить нужный формат DateTime в секцию 'time' в en.yml, указав другой 'format', например, так:
en:
time:
formats:
short_datetime: %B %d, %Y
long_datetime: %B %d, %Y, at %r
hammer_datetime: STOP! %B %d, %Y, is HAMMERTIME!
# and so on... da dum... da dum...
Который вы могли бы использовать так:
<%= l item.create_date, :format => :short_datetime %>
Это подход, которым я пользуюсь сам.
Но для полноты вы также можете сделать это:
en:
datetime:
formats:
default: %B %d, %Y
А затем скажите Rails, как читать, например:
# In your Application Helper
def localize_datetime(dt)
# quick-and-dirty demo... doesn't accept different format options and stuff...
dt.strftime(I18n.t(:"datetime.formats.default", {:locale => I18n.locale }))
end
def ld(dt)
localize_datetime(dt)
end
# or something like that...
Тогда используйте это так:
<%= ld item.create_date %>
Это сохранит вашу информацию о локализации в ваших файлах локализации, но требует грязных рук (код выше не проверяет ошибки, не принимает параметры и т. Д.) И вынуждает вас использовать другую функцию для его вывода (вместо просто «l», мучительно длинного «ld»).
И наконец (и, вероятно, по меньшей мере), мы могли бы просто сказать гномам Rails исправить эту функцию, чтобы она позволила «datetime». :)
Надеюсь, это было полезно. Желаем удачи.