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:
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"
For the people wandering into this old question, there is a solution that does not require calling protected methods. Change your yml
file as follows:
nl: &all
... translations here ...
all:
<<: *all
Now you can simply extract all translations using I18n.t("all")
, which has the benefit of automatically initializing and reloading the translations in development mode (something which doesn't happen if you call the protected methods.)
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.
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
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.
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