在Rails I18n中本地化日期时间

时间:2016-04-27 05:57:21

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

在我的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方法是否会使用这些方法,还是试图从其他地方提取?

谢谢!

2 个答案:

答案 0 :(得分:4)

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

  1. 通过检查Gemfile.lock(实际上,它不是)来检查rails-i18n是否属于我的rails应用程序。属于我的Gemfile.lock的I18n gem是来自activesupport gem的依赖

  2. 检查I18n加载路径是否为" es"区域设置I18n.load_path。没有。

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

    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,格式:"%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] <{1}}

    希望这有帮助。

答案 1 :(得分:1)

我遇到了同样的问题,我使用I18n来定位spanish的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.ymldateday_namemonth_nameabbr_day_names更新了我的abbr_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个文档。 This是获取各种语言的这些字段的链接。