Rails i18n, как получить все значения для определенного ключа?

В Rails i18n, как получить все значения для определенного ключа, используя следующее:

translations = I18n.backend.send(:translations)

получить все ключи

Мне нужно иметь возможность получить определенный раздел, например, вернуть все только под "домой"

en:
  home:
    test: test

person Rubytastic    schedule 01.02.2013    source источник


Ответы (3)


Возвращаемое значение I18n.backend.send(:translations) — это просто хэш, поэтому вы можете получить доступ к подмножеству, просто передав соответствующие ключи.

например если у тебя есть:

en:
  foo:
    bar:
      some_term: "a translation"
      some_other_term: "another translation"   

Затем вы можете получить подмножество хеша под bar с помощью:

I18n.backend.send(:translations)[:en][:foo][:bar]
#=> { :some_term=>"a translation", :some_other_term => "another translation"}
person Chris Salzberg    schedule 01.02.2013
comment
Спасибо, тем временем я узнал, что I18n.t('home') тоже работает - person Rubytastic; 01.02.2013
comment
Хорошо, спасибо! это отлично сработало для меня, так как я искал способ получить фактическое имя ключа. - person richddr; 24.08.2016

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

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

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

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

person My God    schedule 01.02.2013

Установка I18n.locale, затем выполнение I18n.t работает нормально, например:

def self.all_t(string)
  I18n.locale = :en
  en = I18n.t("pages.home.#{string}")
  I18n.locale = :fr
  fr = I18n.("pages.home.#{string}")
  [en, fr]
end
person Dorian    schedule 28.02.2018