I18n没有Rails?

时间:2012-10-16 14:44:18

标签: ruby internationalization i18n-gem

让I18n在没有Rails环境的情况下工作有麻烦:


irb> require 'i18n'
=> true
irb> I18n.load_path=Dir['/usr/lib/ruby/gems/1.9.1/gems/rails-i18n-0.6.6/rails/locale/en.yml']
=> ["/usr/lib/ruby/gems/1.9.1/gems/rails-i18n-0.6.6/rails/locale/en.yml"]
irb> I18n.load_path+=Dir['/usr/lib/ruby/gems/1.9.1/gems/rails-i18n-0.6.6/rails/locale/sk.yml']
=> ["/usr/lib/ruby/gems/1.9.1/gems/rails-i18n-0.6.6/rails/locale/en.yml", "/usr/lib/ruby/gems/1.9.1/gems/rails-i18n-0.6.6/rails/locale/sk.yml"]
irb> I18n.locale=:sk
=> :sk
irb> I18n.default_locale=:sk
=> :sk
irb> I18n.l Time.now
I18n::MissingTranslationData: translation missing:
sk.time.formats.default
  from /usr/lib/ruby/gems/1.9.1/gems/i18n-0.6.1/lib/i18n.rb:289:in
`handle_exception'
  from /usr/lib/ruby/gems/1.9.1/gems/i18n-0.6.1/lib/i18n.rb:159:in
`translate'
  from
/usr/lib/ruby/gems/1.9.1/gems/i18n-0.6.1/lib/i18n/backend/base.rb:55:in
`localize'
  from /usr/lib/ruby/gems/1.9.1/gems/i18n-0.6.1/lib/i18n.rb:236:in
`localize'
  from (irb):11
  from /usr/bin/irb:12:in `<main>'
irb>

我做错了什么? sk.yml包含sk.time.formats.default 元素!!

另外,I18n的默认load_path是什么,所以我不会 为每个翻译YAML / Ruby文件提供完整路径?

感谢。

3 个答案:

答案 0 :(得分:16)

您已使用I18n.load_path设置语言定义的搜索路径。

看来,使用 rails 就足够了。如果没有rails,您还必须使用I18n.backend.load_translations加载语言定义。

总之,您需要两个步骤:

I18n.load_path = Dir['*.yml']
I18n.backend.load_translations

字典用语言键定义,例如像:

en:
  hello: "Hello world"

如果您希望定义没有语言密钥的en.yml,可以通过

加载它们
I18n.backend.store_translations(:en , YAML.load(File.read('en.yml')))

(您也可以使用here-document或直接使用ruby-hash)。

答案 1 :(得分:3)

好像你的load_path设置不正确。

尝试包含整个目录,如果成功,您应该通过调用I18n.load_path来查看:sk和:en文件。

I18n.load_path = Dir['/usr/lib/ruby/gems/1.9.1/gems/rails-i18n-0.6.6/rails/locale/*yml']

直接设置文件路径可能会有点混乱,因为如果文件不存在,I18n不会引发错误。

作为旁注,我建议不要包含rails-i18n gem的翻译,因为路径可能因机器不同而有不同的ruby版本等。项目本地的文件会更好。< / p>

答案 2 :(得分:-1)

您需要安装rails-i18n gem才能获取本地化数据。

使用此gem安装,可以例如在sk本地化中打印月份名称:

require 'rails-i18n'
I18n.load_path += $LOADED_FEATURES
                    .select  {|f| "rails-i18n.rb".in? f }
                    .collect {|f| f.sub('lib/rails-i18n.rb', 'rails/locale/sk.yml') }
I18n.locale = :sk
puts I18n.t('date.month_names').compact

这会产生:

 Január
 Február
 Marec
 Apríl
 Máj
 Jún
 Júl
 August
 September
 Október
 November
 December