如何从Rails I18n中的yml文件中检索所有翻译

时间:2010-09-29 16:14:53

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

我猜测rails将所有已解析的翻译yml文件存储在一种数组/哈希中。 有没有办法访问它?

例如,如果我有一个文件:

en:
  test_string: "testing this"
  warning: "This is just an example

我能做一些像I18n.translations_store [:en] [:test_string]的事吗? 我可以使用YAML :: load解析yml文件,但在我的情况下,我已经将子文件夹中的yml文件拆分为组织,我很确定rails已经解析了所有文件。

6 个答案:

答案 0 :(得分:59)

你必须在后端调用私有方法。这是您访问的方式:

translations = I18n.backend.send(:translations)
translations[:en][:test_string] # => "testing this"

答案 1 :(得分:18)

根据8xx8的评论,更简单的版本:

I18n.t(:foo)
I18n.backend.send(:translations)[:en][:test_string]

I18n.t(".")[:test_string]

这可以减少必须预加载翻译或指定语言环境。

答案 2 :(得分:3)

如果您正在使用I18n::Fallbacks,那么您无法使用I18n.t('.'),因为它只返回内容当前区域设置(例如,' en-GB')任何后备区域设置(例如' en')。为了解决这个问题,你可以迭代回退并使用deep_merge!来组合它们。

module I18n
  class << self
    def all
      fallbacks[I18n.locale].reverse.reduce({}) do |translations, fallback|
        translations.deep_merge!(backend.translate(fallback, '.'))
      end
    end
  end
end

答案 3 :(得分:2)

默认的I18n后端是I18n :: Backend :: Simple,它不会向您公开翻译。 (I18.backend.translations是受保护的方法。)

这通常不是一个好主意,但如果您确实需要此信息并且无法解析该文件,则可以扩展后端类。

class I18n::Backend::Simple
  def translations_store
    translations
  end
end

然后,您可以调用I18n.backend.translations_store来获取已解析的翻译。您可能不应该依赖此作为长期策略,但它可以为您提供您现在需要的信息。

答案 4 :(得分:1)

如果您在rake任务中执行此操作,请记住包含环境,否则它将不会加载您自己的config/locales/

下的语言环境
require "./config/environment.rb" # Do not forget this

namespace :i18n do
  desc "Import I18n to I18n_active_record"
  task :setup do
    I18n.t(:foo)
    translations = I18n.backend.send(:translations)
  end
end

答案 5 :(得分:0)

对于那些徘徊在这个老问题中的人来说,有一个解决方案不需要调用受保护的方法。更改您的yml文件,如下所示:

nl: &all

  ... translations here ...

  all:
    <<: *all

现在您可以使用I18n.t("all")简单地提取所有翻译,这有利于在开发模式下自动初始化和重新加载翻译(如果您调用受保护的方法,则不会发生这种情况。)