【问题标题】:I18n without Rails?没有 Rails 的 I18n?
【发布时间】:2012-10-06 16:59:46
【问题描述】:

只是在没有 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(s) 是什么,所以我不会 为每个翻译 YAML/Ruby 文件提供完整路径而烦恼?

谢谢。

【问题讨论】:

    标签: ruby internationalization i18n-gem


    【解决方案1】:

    您已经使用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)。

    【讨论】:

      【解决方案2】:

      您的 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​​ 版本等。项目本地文件会更好。

      【讨论】:

        【解决方案3】:

        您需要安装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
        

        【讨论】:

        • 问题是关于在没有 Rails 的情况下使用 i18n。所以i18n-rails gem 将是错误的解决方案。
        • 完美答案,这正是我所需要的。 rails-i18n 可以仅用于获取本地化数据,而无需使用 rails 本身。谢谢,点赞
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-17
        • 1970-01-01
        • 2012-05-12
        • 1970-01-01
        • 2015-09-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多