Настройка формата даты и времени в en.yml в Rails 3

23
задан panzhuli 20 March 2011 в 03:22
поделиться

2 ответа

[Несколько месяцев спустя ...]

Проблема в том, что вы пытаетесь определить формат «datetime» в en.yml, но код локализации Rails проверяет только «date» или « время »(смешивая« дата-время »с« время »).

Код ошибки в базовом коде i18n здесь , в строке 53:

type = object.respond_to?(:sec) ? 'time' : 'date'

Он проверяет, может ли данный объект ответить на "sec «; если это так, он читает материал "time" в en.yml, если нет, он читает формат "date". Нет даты и времени.

Как предложил Тираэль, вы можете заставить его подчиняться своей воле под дулом пистолета через код инициализации. Это, безусловно, сработает, но теперь вы поместили код локализации в ваши инициализаторы. Это потенциально запутанно и грязно, ИМО.

IMO, более чистый способ сделать это - добавить нужный формат DateTime в секцию «time» в en.yml, указав другой «формат», например, так:

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». :)

Надеюсь, что это было полезно. Желаем удачи.

33
ответ дан 29 November 2019 в 01:40
поделиться

просто хочу уточнить, что если вы используете с активной записью, просто конвертируйте значение строки datetime в объект date, как в примере ниже.

en:
  date:
    formats:
      default: "%Y-%m-%d"
      short: "%b %d"
      long: "%B %d, %Y"

<%= l(post.the_created_at.to_date, format: :long) %>

1
ответ дан 29 November 2019 в 01:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: