9

我的 Ruby On Rails 3 应用程序中的日期翻译有一个奇怪的问题,我真的不明白为什么......

这是我的en.ymlfr.yml

fr:
  date:
    formats:
      default: "%d/%m/%Y"
      short: "%e %b"
      long: "%e %B %Y" 
  time:
    formats:
      default: "%d %B %Y %H:%M:%S"
      short: "%d %b %H:%M"
      long: "%A %d %B %Y %H:%M"
    am: 'am'
    pm: 'pm'



en:
  date:
    formats:
      default: "%Y-%m-%d"
      long: "%B %d, %Y"
      short: "%b %d"
  time:
    am: am
    formats:
      default: ! '%a, %d %b %Y %H:%M:%S %z'
      long: ! '%B %d, %Y %H:%M'
      short: ! '%d %b %H:%M'
    pm: pm

这不是特定于特定视图,而是例如在我的一个视图中:

<td><%=l job_application.created_at, :format => :default %></td>

我得到了那些奇怪的输出:

With locale = :en
=> t, 30 o 2012 18:09:33 +0000

With locale = :fr
=> 30 o 2012 18:09:33

这些错误的“格式”从何而来?

我正在使用 Rails 3.2.8(使用 Postgresql / gem pg),与 I18n 相关的所有内容都可以正常工作,除了 dates

谢谢你的帮助 !

4

3 回答 3

13

我想我终于想通了,抱歉花了这么长时间。

Railsl助手只是调用I18n.localize. 如果您跟踪I18n.localize代码,您将在这里结束:

format = format.to_s.gsub(/%[aAbBp]/) do |match|
  case match
  when '%a' then I18n.t(:"date.abbr_day_names",                  :locale => locale, :format => format)[object.wday]
  when '%A' then I18n.t(:"date.day_names",                       :locale => locale, :format => format)[object.wday]
  when '%b' then I18n.t(:"date.abbr_month_names",                :locale => locale, :format => format)[object.mon]
  when '%B' then I18n.t(:"date.month_names",                     :locale => locale, :format => format)[object.mon]
  when '%p' then I18n.t(:"time.#{object.hour < 12 ? :am : :pm}", :locale => locale, :format => format) if object.respond_to? :hour
  end
end

所以localize助手不strftime用于日期/时间的“字符串”部分,它试图自己做。为上述月份和日期名称添加翻译(作为 YAML 中的数组),您的本地化日期和时间应该开始工作。

如果你的 YAML 中没有这些翻译数组,那么I18n.t(:"date.abbr_month_names")会给你这样的字符串:

"translation missing: en.date.abbr_month_names"

然后I18n.localize最终会做这样的愚蠢事情:

"translation missing: en.date.abbr_month_names"[10]

这将使用String#[]而不是预期的Array#[],你最终会得到随机的单字符月份和日期名称。

于 2012-10-07T02:50:29.120 回答
1

这些错误的“格式”从何而来?

因为created_at是 DateTime,所以使用time格式(不是date)。

https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/en.yml#L195

time:
  am: am
  formats:
    default: ! '%a, %d %b %Y %H:%M:%S %z'
于 2012-10-01T07:06:23.027 回答
0

在您的控制台中输入

I18n.t(:"date") 

检查您是否获得了您在翻译.yml文件中定义的翻译。

将结构与标准 EN 语言环境进行比较

I18n.t(:"date", locale:'en')

这让我注意到我date:在 my 中两次声明了该属性.yml,并且第一部分被第二个声明覆盖。

你应该得到abbr_month_names你打电话时声明的那个

I18n.t(:"date.abbr_month_names")

这些是调用时将使用的%b

如果没有,请检查您的语言环境.yml文件以确保它们被正确声明,并且没有被声明两次。

您也可以打电话I18n.locale检查.yml您正在编辑的文件是否是 rails 正在使用的文件

于 2020-05-22T14:29:56.337 回答