diff --git a/lib/i18n/backend/fallbacks.rb b/lib/i18n/backend/fallbacks.rb index 7a49fa2c..f83bfc30 100644 --- a/lib/i18n/backend/fallbacks.rb +++ b/lib/i18n/backend/fallbacks.rb @@ -37,7 +37,8 @@ module Fallbacks def translate(locale, key, options = {}) return super unless options.fetch(:fallback, true) return super if options[:fallback_in_progress] - default = extract_non_symbol_default!(options) if options[:default] + original_default = options[:default] + extract_non_symbol_default!(options) begin options[:fallback_in_progress] = true @@ -45,7 +46,7 @@ def translate(locale, key, options = {}) begin catch(:exception) do result = super(fallback, key, options) - return result if (result.nil? && options.key?(:default) && options[:default].nil?) || !result.nil? + return result unless result.nil? end rescue I18n::InvalidLocale # we do nothing when the locale is invalid, as this is a fallback anyways. @@ -55,7 +56,7 @@ def translate(locale, key, options = {}) options.delete(:fallback_in_progress) end - return super(locale, nil, options.merge(:default => default)) if default + return super(locale, nil, options.merge(:default => original_default)) if options.key?(:default) throw(:exception, I18n::MissingTranslation.new(locale, key, options)) end diff --git a/test/backend/fallbacks_test.rb b/test/backend/fallbacks_test.rb index 9a44c143..23e47131 100644 --- a/test/backend/fallbacks_test.rb +++ b/test/backend/fallbacks_test.rb @@ -59,6 +59,11 @@ def setup assert_equal({}, I18n.t(:missing_bar, :locale => :'de-DE', :default => {})) end + test "returns the :de translation for a missing :'de-DE' when :default is nil" do + assert_equal 'Bar in :de', I18n.t(:bar, :locale => :'de-DE', :default => nil) + assert_nil I18n.t(:missing_bar, :locale => :'de-DE', :default => nil) + end + test "returns the :'de-DE' default :baz translation for a missing :'de-DE' when defaults contains Symbol" do assert_equal 'Baz in :de-DE', I18n.t(:missing_foo, :locale => :'de-DE', :default => [:baz, "Default Bar"]) end