Подтвердить что ты не робот

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

Согласно документации на http://guides.rubyonrails.org/i18n.html#adding-date-time-formats, лучший способ задать конкретные форматы для даты - определить их в /config/locales/en.yml. Я скопировал и вставил этот файл: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/locale/en.yml в мой каталог локалей.

Я сделал несколько изменений (звездочки только для выделения):

"en-US":
  date:
    formats:
      default: "%Y-%m-%d"
      **short: "short %b %d"**

и

time:
    formats:
      default: "%a, %d %b %Y %H:%M:%S %z "
      **short: "short %B %d, %Y"**

И в моем частичном:

<%= l item.create_date, :format => :short %>

где create_date - это строка datetime в моей базе данных.

Я перезапустил свой сервер, но все равно получаю дату, отформатированную так: 15 марта 00:00

У меня такое ощущение, что это потому, что я не использую ни дату, ни время. Я не могу найти определение "короткий" или "длинный" для datetime. Я попытался добавить его в этот файл, добавив этот код:

datetime:
    formats:
      short: "short %B %d, %Y"

Не повезло. Что мне не хватает. Я чувствую, что следую инструкциям напрямую. Спасибо!

4b9b3361

Ответ 1

[несколько лет спустя...]

Если вы хотите СУШИТЬ свои форматы дат и/или у вас есть устаревший код с to_s повсюду и не планируете интернационализировать свое приложение, вы можете сделать это:

I18n.t('date.formats').each do |key, value|
  Date::DATE_FORMATS[key] = value
end

Затем просто определите свои форматы в config/locales/en.yml. Конечно, если вы когда-либо планируете переводить свое приложение, вам нужно будет изменить все вхождения to_s, чтобы использовать метод I18n.l, предложенный ниже.

Вы также можете использовать это без Rails. Просто добавьте следующее перед вышеуказанным кодом:

require 'active_support/time'
I18n.load_path << 'en.yml'

Ответ 2

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

Проблема заключается в том, что вы пытаетесь определить формат "datetime" в en.yml, но код локализации Rails проверяет только "дату" или "время" (сбрасывая "datetime" с "time" ).

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

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

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

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

IMO, более чистым способом сделать это будет добавить формат, который вы хотите для DateTime, в раздел "время" 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".:)

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

Ответ 3

Я подозреваю, что проблема здесь в функции Rails 'I18n: l. Попробуйте следующее:

  • Добавьте ниже строки в один из файлов инициализации, например config/environment.rb:

    DateTime:: DATE_FORMATS [: short] = "short% Y-% m-% d% H:% M:% S"

    Время:: DATE_FORMATS [: short] = "short% Y-% m-% d% H:% M:% S"

    Дата:: DATE_FORMATS [: short] = "short% Y-% m-% d"

  • изменить вид:

    <% = item.create_date.to_s (: short)% >

Вы можете увидеть выходное изменение на "short something".

Я знаю, что это не идеальный ответ, но надеюсь, что он может дать вам несколько советов (у меня не было времени проверить функцию I18n:: l).

Ответ 4

просто хочу уточнить, что если вы используете активную запись, просто просто преобразуйте значение строки 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) %>