Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

является

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

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

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

nl: &all

  ... translations here ...

  all:
    <<: *all

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

Ответ 6

Если вы делаете это в задаче грабли, не забудьте включить среду, иначе она не будет загружать ваши собственные локали, которые живут под 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