【问题标题】:Localizing datetimes in Rails I18n在 Rails I18n 中本地化日期时间
【发布时间】:2016-08-21 06:06:44
【问题描述】:

在我的 locale 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 方法是否甚至利用了这些,还是试图从其他地方拉取?

谢谢!

【问题讨论】:

  • 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/gem 项目是否定义了额外的翻译?好像有什么东西在那里坏了

标签: ruby-on-rails internationalization rails-i18n


【解决方案1】:

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

  1. 通过检查 Gemfile.lock 来检查 rails-i18n 是否是我的 rails 应用程序的一部分(实际上不是)。我的 Gemfile.lock 中的 I18n gem 是来自 activesupport gem

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

  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]

返回"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)

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

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

希望这会有所帮助。

【讨论】:

  • 感谢您的详细分析,现在这很有意义(特别想知道"s" 是如何被返回的:))。我认为我的基本错误是假设默认情况下包含rails-i18n,但事实并非如此。我猜如果我在其中添加那个 gem 将会有西班牙语、日语等的翻译文件......谢谢!
【解决方案2】:

我遇到了同样的问题,我使用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" 

我用date、day_name、month_name、abbr_day_names、abbr_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 将包括 date, day_name, month_name, abbr_day_names, abbr_month_names 用于英语,而对于西班牙语和其他感兴趣的语言,我们需要在我们正在维护的相应 yaml 文档中添加这些字段。 This 是获取相应语言的这些字段的链接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多