How to retrieve all translations from yml files in Rails I18n

20,303

Solution 1

You got to call a private method on the backend. This is how you get access:

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

Solution 2

As per 8xx8's comment, a simpler version of:

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

is

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

This mitigates having to both preload the translations or specify the locale.

Solution 3

If you are using I18n::Fallbacks unfortunately you can't use I18n.t('.') as it just returns the contents current locale (eg. 'en-GB') and nothing from any of the fallback locales (eg 'en'). To get round this you can iterate over the fallbacks and use deep_merge! to combine them.

module I18n
  class << self
    def all
      fallbacks[I18n.locale].reverse.reduce({}) do |translations, fallback|
        translations.deep_merge!(backend.translate(fallback, '.'))
      end
    end
  end
end

Solution 4

If you're doing this in a rake task, remember to include the enviroment, or otherwise it will not load your own locales which lives under 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

Solution 5

The default I18n backend is I18n::Backend::Simple, which does not expose the translations to you. (I18.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.

Share:
20,303
Tiago
Author by

Tiago

I do not monitor this for job offers. If you send anything it will not get to me. Thank you

Updated on July 09, 2022

Comments

  • Tiago
    Tiago almost 2 years

    I'm guessing that rails stores all the parsed translations yml files in a sort of array/hash. Is there a way to access this?

    For example, if I've a file:

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

    Could I do something like, I18n.translations_store[:en][:test_string] ? I could parse the yml file with YAML::load, but in my case I've splitted the yml files in subfolders for organization, and I'm pretty sure that rails already parsed them all.