# File lib/i18n/backend/chain.rb, line 23 def initialize(*backends) self.backends = backends end
# File lib/i18n/backend/chain.rb, line 35 def available_locales backends.map { |backend| backend.available_locales }.flatten.uniq end
# File lib/i18n/backend/chain.rb, line 59 def exists?(locale, key) backends.any? do |backend| backend.exists?(locale, key) end end
# File lib/i18n/backend/chain.rb, line 65 def localize(locale, object, format = :default, options = {}) 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
# File lib/i18n/backend/chain.rb, line 27 def reload! backends.each { |backend| backend.reload! } end
# File lib/i18n/backend/chain.rb, line 31 def store_translations(locale, data, options = {}) backends.first.store_translations(locale, data, options) end
# File lib/i18n/backend/chain.rb, line 39 def translate(locale, key, default_options = {}) namespace = nil options = default_options.except(: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? return translation end end end return namespace if namespace throw(:exception, I18n::MissingTranslation.new(locale, key, options)) end
# File lib/i18n/backend/chain.rb, line 75 def namespace_lookup?(result, options) result.is_a?(Hash) && !options.has_key?(:count) 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.
# File lib/i18n/backend/chain.rb, line 84 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