Module: I18n::Backend::Fallbacks

Defined in:
lib/i18n/backend/fallbacks.rb

Instance Method Summary collapse

Instance Method Details

#exists?(locale, key) ⇒ Boolean

Returns:

  • (Boolean)


71
72
73
74
75
76
77
78
79
80
81
# File 'lib/i18n/backend/fallbacks.rb', line 71

def exists?(locale, key)
  I18n.fallbacks[locale].each do |fallback|
    begin
      return true if super(fallback, key)
    rescue I18n::InvalidLocale
      # we do nothing when the locale is invalid, as this is a fallback anyways.
    end
  end

  false
end

#extract_non_symbol_default!(options) ⇒ Object



62
63
64
65
66
67
68
69
# File 'lib/i18n/backend/fallbacks.rb', line 62

def extract_non_symbol_default!(options)
  defaults = [options[:default]].flatten
  first_non_symbol_default = defaults.detect{|default| !default.is_a?(Symbol)}
  if first_non_symbol_default
    options[:default] = defaults[0, defaults.index(first_non_symbol_default)]
  end
  return first_non_symbol_default
end

#translate(locale, key, options = EMPTY_HASH) ⇒ Object

Overwrites the Base backend translate method so that it will try each locale given by I18n.fallbacks for the given locale. E.g. for the locale :“de-DE” it might try the locales :“de-DE”, :de and :en (depends on the fallbacks implementation) until it finds a result with the given options. If it does not find any result for any of the locales it will then throw MissingTranslation as usual.

The default option takes precedence over fallback locales only when it’s a Symbol. When the default contains a String, Proc or Hash it is evaluated last after all the fallback locales have been tried.



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/i18n/backend/fallbacks.rb', line 39

def translate(locale, key, options = EMPTY_HASH)
  return super unless options.fetch(:fallback, true)
  return super if options[:fallback_in_progress]
  default = extract_non_symbol_default!(options) if options[:default]

  fallback_options = options.merge(:fallback_in_progress => true)
  I18n.fallbacks[locale].each do |fallback|
    begin
      catch(:exception) do
        result = super(fallback, key, fallback_options)
        return result unless result.nil?
      end
    rescue I18n::InvalidLocale
      # we do nothing when the locale is invalid, as this is a fallback anyways.
    end
  end

  return if options.key?(:default) && options[:default].nil?

  return super(locale, nil, options.merge(:default => default)) if default
  throw(:exception, I18n::MissingTranslation.new(locale, key, options))
end