module I18n::Backend::Chain::Implementation
Attributes
Public Class Methods
Source
# File lib/i18n/backend/chain.rb, line 27 def initialize(*backends) self.backends = backends end
Public Instance Methods
Source
# File lib/i18n/backend/chain.rb, line 52 def available_locales backends.map { |backend| backend.available_locales }.flatten.uniq end
Source
# File lib/i18n/backend/chain.rb, line 44 def eager_load! backends.each { |backend| backend.eager_load! } end
Source
# File lib/i18n/backend/chain.rb, line 76 def exists?(locale, key, options = EMPTY_HASH) backends.any? do |backend| backend.exists?(locale, key, options) end end
Source
# File lib/i18n/backend/chain.rb, line 31 def initialized? backends.all? do |backend| backend.instance_eval do return false unless initialized? end end true end
Source
# File lib/i18n/backend/chain.rb, line 82 def localize(locale, object, format = :default, options = EMPTY_HASH) backends.each do |backend| catch(:exception) do result = backend.localize(locale, object, format, options) and return result end end throw(:exception, I18n::MissingTranslation.new(locale, format, options)) end
Source
# File lib/i18n/backend/chain.rb, line 40 def reload! backends.each { |backend| backend.reload! } end
Source
# File lib/i18n/backend/chain.rb, line 48 def store_translations(locale, data, options = EMPTY_HASH) backends.first.store_translations(locale, data, options) end
Source
# File lib/i18n/backend/chain.rb, line 56 def translate(locale, key, default_options = EMPTY_HASH) namespace = nil options = Utils.except(default_options, :default) backends.each do |backend| catch(:exception) do options = default_options if backend == backends.last translation = backend.translate(locale, key, options) if namespace_lookup?(translation, options) namespace = _deep_merge(translation, namespace || {}) elsif !translation.nil? || (options.key?(:default) && options[:default].nil?) return translation end end end return namespace if namespace throw(:exception, I18n::MissingTranslation.new(locale, key, options)) end
Protected Instance Methods
Source
# File lib/i18n/backend/chain.rb, line 92 def init_translations backends.each do |backend| backend.send(:init_translations) end end
Source
# File lib/i18n/backend/chain.rb, line 108 def namespace_lookup?(result, options) result.is_a?(Hash) && !options.has_key?(:count) end
Source
# File lib/i18n/backend/chain.rb, line 98 def translations backends.reverse.each_with_object({}) do |backend, memo| partial_translations = backend.instance_eval do init_translations unless initialized? translations end Utils.deep_merge!(memo, partial_translations) { |_, a, b| b || a } end end
Private Instance Methods
Source
# File lib/i18n/backend/chain.rb, line 117 def _deep_merge(hash, other_hash) copy = hash.dup other_hash.each_pair do |k,v| value_from_other = hash[k] copy[k] = value_from_other.is_a?(Hash) && v.is_a?(Hash) ? _deep_merge(value_from_other, v) : v end copy end
This is approximately what gets used in ActiveSupport. However since we are not guaranteed to run in an ActiveSupport context it is wise to have our own copy. We underscore it to not pollute the namespace of the including class.