在Rails I18n中本地化日期时间

use*_*003 2 ruby-on-rails internationalization rails-i18n

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

> I18n.available_locales
=> [:en, :de, :es, :ja, :"pt-BR", :"zh-CN", :"zh-HK", :"zh-TW"]
Run Code Online (Sandbox Code Playgroud)

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

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

哪个很棒。然后我用西班牙语和日语尝试相同的方法-

> 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"
Run Code Online (Sandbox Code Playgroud)

看来月份名称正在被翻译为"s"

Rails I18n gem 绝对为上述语言环境定义了月份名称。该#localize方法是否甚至利用了这些方法,还是试图从其他地方提取?

谢谢!

kga*_*har 7

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

\n\n
   I18n.l(raw_date.to_time, format: :long) = "Tuesday, July 11, 2017" \n
Run Code Online (Sandbox Code Playgroud)\n\n

对于西班牙语我得到

\n\n
  I18n.l(raw_date.to_time, format: :long) = "a, t 11, 2017" \n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
es:\n date:\n   day_names:\n    - domingo\n    - lunes\n    - martes\n    - mi\xc3\xa9rcoles\n    - jueves\n    - viernes\n    - s\xc3\xa1bado\n   month_names:\n   -\n   - enero\n   - febrero\n   - marzo\n   - abril\n   - mayo\n   - junio\n   - julio\n   - agosto\n   - septiembre\n   - octubre\n   - noviembre\n   - diciembre\n time:\n  formats:\n   long: \'%A, %B %d, %Y\'\n   short: \'%b %d, %Y\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

之后对于spanish我得到了想要的结果。

\n\n
I18n.l(raw_date.to_time, format: :long) = "viernes, julio 21, 2017"\n
Run Code Online (Sandbox Code Playgroud)\n\n

在浏览文档时,我发现默认情况下I18n将包含 \n dateday_name、 、month_name、英语abbr_day_namesabbr_month_names而对于西班牙语和其他感兴趣的语言,我们需要在yaml我们维护的相应文档中添加这些字段。是获取相应语言的这些字段的链接。

\n


小智 5

我收到的输出与提到的相同。下面是调试行为的步骤。

  1. 检查是否Rails的国际化是通过检查Gemfile.lock的我的Rails应用程序的一部分(其实,这是不)。我的Gemfile.lock的一部分I18n gem是来自activesupport gem的依赖

  2. 在I18n的加载路径中检查了“ es”语言环境的所有翻译文件I18n.load_path。没有。

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

I18n.with_locale(:en){I18n.localize(Time.zone.now,格式:“%B,%Y”)}

内部通话

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

返回 "April"

同样,

I18n.with_locale(:es){I18n.localize(Time.zone.now,格式:“%B,%Y”)}

内部通话

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

但是没有可用的翻译,

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

=>“缺少翻译:es.date.month_names”

Time.zone.now.mon = 4因此,它返回的"translation missing: es.date.month_names"[4]"s"

希望这可以帮助。