How to retrieve all translations from yml files in Rails I18n
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.
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, 2022Comments
-
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.