没有使用Rails如何进行I18n?

9

只是在没有Rails环境的情况下,很难让I18n正常工作:


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个回答

17

你已经通过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哈希直接导向它。)

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 版本和不同的机器而有所不同。最好使用项目本地的文件。

0
您需要安装rails-i18n宝石才能获得本地化数据。
通过安装此宝石,例如可以使用以下命令在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

问题是关于在没有Rails的情况下使用i18n。因此,“i18n-rails”宝石将是错误的解决方案。 - armchairdj
完美的答案,这正是我所需要的。rails-i18n可以仅用于获取本地化数据,而无需使用Rails本身。谢谢,已点赞。 - sidney

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