Настройка формата даты и времени в en.yml в Rails 3 - PullRequest
22 голосов
/ 20 марта 2011

Согласно документации на 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 - строка даты и времени в моей базе данных.

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

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

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

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

Ответы [ 4 ]

32 голосов
/ 28 июля 2011

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

Проблема в том, что вы пытаетесь определить формат «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». :)

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

8 голосов
/ 20 марта 2011

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

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

    DateTime :: DATE_FORMATS [: short] = "короткий% Y-% m-% d% H:% M:% S"

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

    Дата :: DATE_FORMATS [: short] = "короткий% Y-% m-% d"

  2. изменить вид:

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

Вы можете видеть, как выходной сигнал изменяется на «что-то короткое».

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

6 голосов
/ 30 октября 2013

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

Если вы хотите СУШИТЬ свои форматы дат и / или у вас есть устаревший код с 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'
1 голос
/ 29 ноября 2017

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...