在 Rails I18n 中本地化日期时间

Localizing datetimes in Rails I18n

在我的语言环境 rails 控制台中,我可以通过 I18n gem

看到我可以使用以下语言环境
> I18n.available_locales
=> [:en, :de, :es, :ja, :"pt-BR", :"zh-CN", :"zh-HK", :"zh-TW"]

我尝试使用 localize 和特定的英文日期格式 -

> I18n.with_locale("en") { I18n.l(Time.zone.now, format: "%B, %Y") }
=> "April, 2016"

效果很好。然后我用西班牙语和日语尝试同样的事情 -

> I18n.with_locale("es") { I18n.l(Time.zone.now, format: "%B, %Y") }
=> "s, 2016"
> I18n.with_locale("ja") { I18n.l(Time.zone.now, format: "%B, %Y") }
=> "s, 2016"

月份名称似乎被翻译为 "s"

rails I18n gem definitely defines month names 用于上述语言环境。 #localize 方法甚至利用了这些方法,还是试图从其他地方提取?

谢谢!

我收到了与 you 相同的一组输出 mentioned.The 以下是我调试行为所遵循的步骤。

  1. 检查是否 rails-i18n is part of my rails application by checking the Gemfile.lock (Actually, it is not). The I18n gem that is part of my Gemfile.lock is a dependency from activesupport gem

  2. 已检查“es”语言环境 I18n.load_path 的任何翻译文件的 I18n 加载路径。有 none.

  3. 了解 I18n.translate 方法如何处理日期和时间格式。格式字符串中的格式指令 [%a, %A, %b, %B, %p, %P] 仅用于本地化(日、月、子午线 (AM/PM) 指示符 - 更短和更长格式),因为只有那些包含语言文本。

I18n.with_locale(:en) { I18n.localize(Time.zone.now, format: "%B, %Y") }

内部调用

I18n.translate(:"date.month_names", :locale => :en)[Time.zone.now.mon]

那个returns"April"

同样,

I18n.with_locale(:es) { I18n.localize(Time.zone.now, format: "%B, %Y") }

内部调用

I18n.translate(:"date.month_names", :locale => :es)[Time.zone.now.mon]

但是没有可用的翻译,

I18n.translate(:"date.month_names", :locale => :es)

=> "translation missing: es.date.month_names"

Time.zone.now.mon = 4。所以,它 returns "translation missing: es.date.month_names"[4]"s"

希望对您有所帮助。

我遇到了同样的问题,我使用 I18n 将我的 rails 应用程序本地化为 spanish。在进行时间翻译时,英语工作正常,如下所示:

   I18n.l(raw_date.to_time, format: :long) = "Tuesday, July 11, 2017" 

对于西班牙语,我得到

  I18n.l(raw_date.to_time, format: :long) = "a, t 11, 2017" 

我用 dateday_namemonth_nameabbr_day_namesabbr_month_names 更新了我的 es.yml 文档,如下所示:

es:
 date:
   day_names:
    - domingo
    - lunes
    - martes
    - miércoles
    - jueves
    - viernes
    - sábado
   month_names:
   -
   - enero
   - febrero
   - marzo
   - abril
   - mayo
   - junio
   - julio
   - agosto
   - septiembre
   - octubre
   - noviembre
   - diciembre
 time:
  formats:
   long: '%A, %B %d, %Y'
   short: '%b %d, %Y'

在那之后 spanish 我得到了想要的结果。

I18n.l(raw_date.to_time, format: :long) = "viernes, julio 21, 2017"

在浏览文档时我发现默认情况下 I18n 将包括 dateday_namemonth_nameabbr_day_namesabbr_month_names 用于英语,而对于西班牙语和其他感兴趣的语言,我们需要在相应的字段中添加这些字段yaml 个我们正在维护的文档。 This 是 link 以获取各个语言的这些字段。