web-dev-qa-db-ja.com

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は、アイテムのデータベースの日時行です。

サーバーを再起動しましたが、次のような形式の日付が表示されます:15 Mar 00:00

日付も時刻も使っていないからだと感じています。日時の「短い」または「長い」の定義が見つかりません。このコードを追加して、このファイルに追加してみました。

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

運がない。私は何が欠けています。指示に直接従っているような気がします。ありがとう!

23
panzhuli

[数年後...]

DRY日付形式を更新したい場合、および/または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'
6
PhilT

[数ヶ月後...]

問題は、en.ymlで「datetime」形式を定義しようとしているのに、Railsローカリゼーションコードは「date」または「time」のみをチェックする(「datetime」をまとめて「時間」付き)。

問題のあるコードは、i18nベースコード ここ の53行目にあります。

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

指定されたオブジェクトが「sec」に応答できるかどうかをチェックします。もしそうなら、それはen.ymlの「時間」のものを読みます、そうでなければ、それは「日付」フォーマットを読みます。 「日時」はありません。

Tyraelが示唆したように、初期化コードを介して、銃を突きつけて意志に従うように強制することができます。それは確かに機能しますが、これでローカリゼーションコードをイニシャライザーに配置しました。それは潜在的に混乱し、厄介です、IMO。

IMO、これを行うためのよりクリーンな方法は、次のように別の「フォーマット」を指定することにより、DateTimeに必要なフォーマットをen.ymlの「time」セクションに追加することです。

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 gnomesにその関数を修正して、「datetime」を許可するように指示することができます。:)

それがお役に立てば幸いです。幸運を祈ります。

33
Rick Reilly

ここでの問題はRailsのI18n:l関数にあると思います。これで試してください:

  1. Config/environment.rbなどの初期化ファイルの1つに、以下の行を追加します。

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

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

    Date :: DATE_FORMATS [:short] = "short%Y-%m-%d"

  2. ビューの変更:

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

出力が「短いもの」に変化するのがわかります。

私はそれが完璧な答えではないことを知っていますが、それがあなたにいくつかのヒントを与えることを願っています(私はI18n :: l関数をチェックする時間がありませんでした)。

8
Tyrael Tong

アクティブレコードで使用する場合は、以下の例のように、文字列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
Kiry Meas