11

In Rails i18n, how to get all values for a certain key using the following:

translations = I18n.backend.send(:translations)

get all the keys

I need to be able to get a certain section for example only return everything under "home"

en:
  home:
    test: test
sjain
  • 23,126
  • 28
  • 107
  • 185
Rubytastic
  • 15,001
  • 18
  • 87
  • 175

4 Answers4

14

The return value of I18n.backend.send(:translations) is just a hash, so you can access a subset just by passing in the appropriate keys.

e.g. if you have:

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

Then you can get the the subset of the hash under bar with:

I18n.backend.send(:translations)[:en][:foo][:bar]
#=> { :some_term=>"a translation", :some_other_term => "another translation"}
Chris Salzberg
  • 27,099
  • 4
  • 75
  • 82
5

The default I18n backend is I18n::Backend::Simple, which does not expose the translations to you. (I18n.backend.translations is a protected method.)

This isn't generally a good idea, but if you really need this info and can't parse the file, you can extend the backend class.

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

You can then call I18n.backend.translations_store to get the parsed translations. You probably shouldn't rely on this as a long term strategy, but it gets you the information you need right now.

Eliot Sykes
  • 9,616
  • 6
  • 50
  • 64
sjain
  • 23,126
  • 28
  • 107
  • 185
0

Setting I18n.locale then doing I18n.t works fine, e.g.:

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
Dorian
  • 22,759
  • 8
  • 120
  • 116
0

Late to the party here, but I just had to extract all the country codes from a Rails locale file, and the suggestions above did not work for Rails 6 and i18n 1.12.

Turns out that the translations method on I18n::Backend::Simple is now public, so we can now use : I18n.backend.translations(do_init: true) to retrieve the translations hash.

Therefore the home node mentioned above can be retrieved with : I18n.backend.translations(do_init: true)[:fr][:home]

Hope this helps

jean-baptiste
  • 674
  • 7
  • 18