在Rails I18n中本地化日期时间

9
在我的本地 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 确实为上述区域定义了月份名称。但是,#localize 方法是否真正使用了这些名称,还是试图从其他地方获取?

谢谢!


1
I18n.with_locale("es") { I18n.l(Time.zone.now, format: "%B, %Y") } 对我有效,但是 I18n.with_locale("ja") { I18n.l(Time.zone.now, format: "%B, %Y") } 不行。你使用的 Rails 版本是什么? - Anthony E
1
你的 Rails/Gem 项目定义了额外的翻译吗?似乎那里出了些问题。 - Малъ Скрылевъ
2个回答

8

我收到了与提到的相同输出。以下是我遵循的调试行为的步骤。

  1. 通过检查Gemfile.lock文件(实际上没有)来确定rails-i18n是否是我的Rails应用程序的一部分。 Gemfile.lock中的I18n gem是activesupport gem的依赖项。

  2. 检查“es”语言环境的任何翻译文件I18n.load_path。 没有找到。

  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]

返回"四月"

同样地,

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。因此,它返回"translation missing: es.date.month_names"[4],即"s"

希望这可以帮助您。


感谢您的详细分析,现在完全明白了(特别是想知道为什么一直返回“s” :))。我认为我的根本错误是假设rails-i18n默认包含在内,但实际上并不是。我猜想如果我添加这个gem,它将具有来自西班牙语、日语等的翻译文件...谢谢! - user2490003

6

我遇到了同样的问题,我使用 I18n 对我的 Rails 应用进行西班牙语本地化。在进行时间翻译时,它对于英文是正常工作的,如下所示:

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

对于西班牙语,我得到的是

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

我已经按照以下方式更新了我的es.yml文档,包括dateday_namemonth_nameabbr_day_namesabbr_month_names

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文档中进行维护。您可以通过此链接获取相应语言的这些字段。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接