Как получить все переводы из файлов yml в Rails I18n

Я предполагаю, что rails хранит все проанализированные переводы YML-файлов в виде массива / хэша. Есть ли способ получить доступ к этому?

например, если у меня есть файл:

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

могу ли я сделать что-то вроде, I18n.translations_store [: en] [: test_string] ? Я мог бы проанализировать файл yml с помощью YAML:: load, но в моем случае я разделил файлы yml в подпапках для организации, и я уверен, что rails уже проанализировал их все.

6 ответов


вы должны вызвать частный метод на бэкэнде. Вот как вы получаете доступ:

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

согласно комментарию 8xx8, более простая версия:

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

и

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

это уменьшает необходимость предварительной загрузки переводов или указания локали.


если вы используете 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

по умолчанию i18n backend - это i18n::Backend::Simple, который не предоставляет вам переводы. (I18.базовая программа.переводы-это защищенный метод.)

обычно это не очень хорошая идея, но если вам действительно нужна эта информация и вы не можете разобрать файл, вы можете расширить класс backend.

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

затем вы можете позвонить I18n.backend.translations_store для получения проанализированных переводов. Вероятно, вам не следует полагаться на это как на долгосрочную стратегию, но она дает вам необходимую информацию сейчас.


для людей, блуждающих в этом старом вопросе, есть решение, которое не требует вызова защищенных методов. Измените свой yml файл выглядит следующим образом:

nl: &all

  ... translations here ...

  all:
    <<: *all

Теперь вы можете просто извлечь все переводы через I18n.t("all"), что имеет преимущество автоматической инициализации и перезагрузки переводов в режиме разработки (чего не происходит, если вы вызываете защищенные методы.)


Если вы делаете это в задаче 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