Как получить все переводы из файлов 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
