module I18n::Backend::Chain::Implementation

def _deep_merge(hash, other_hash)

to not pollute the namespace of the including class.
it is wise to have our own copy. We underscore it
However since we are not guaranteed to run in an ActiveSupport context
This is approximately what gets used in ActiveSupport.
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

def available_locales

def available_locales
  backends.map { |backend| backend.available_locales }.flatten.uniq
end

def eager_load!

def eager_load!
  backends.each { |backend| backend.eager_load! }
end

def exists?(locale, key, options = EMPTY_HASH)

def exists?(locale, key, options = EMPTY_HASH)
  backends.any? do |backend|
    backend.exists?(locale, key, options)
  end
end

def init_translations

def init_translations
  backends.each do |backend|
    backend.send(:init_translations)
  end
end

def initialize(*backends)

def initialize(*backends)
  self.backends = backends
end

def initialized?

def initialized?
  backends.all? do |backend|
    backend.instance_eval do
      return false unless initialized?
    end
  end
  true
end

def localize(locale, object, format = :default, options = EMPTY_HASH)

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

def namespace_lookup?(result, options)

def namespace_lookup?(result, options)
  result.is_a?(Hash) && !options.has_key?(:count)
end

def reload!

def reload!
  backends.each { |backend| backend.reload! }
end

def store_translations(locale, data, options = EMPTY_HASH)

def store_translations(locale, data, options = EMPTY_HASH)
  backends.first.store_translations(locale, data, options)
end

def translate(locale, key, default_options = EMPTY_HASH)

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

def translations

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