How to retrieve all translations from yml files in Rails I18n

前端 未结 6 1116
Happy的楠姐
Happy的楠姐 2020-12-24 11:38

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:



        
相关标签:
6条回答
  • 2020-12-24 12:17

    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"
    
    0 讨论(0)
  • 2020-12-24 12:18

    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.)

    0 讨论(0)
  • 2020-12-24 12:21

    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.

    0 讨论(0)
  • 2020-12-24 12:21

    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
    
    0 讨论(0)
  • 2020-12-24 12:35

    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.

    0 讨论(0)
  • 2020-12-24 12:36

    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
    
    0 讨论(0)
提交回复
热议问题