From 506e2a5581f0ab5c3eb2c31940b3acb9c81b9d1e Mon Sep 17 00:00:00 2001 From: Daniel Rikowski Date: Sat, 17 Jan 2015 17:51:39 +0100 Subject: [PATCH] Fix fallbacks when translating key arrays --- lib/i18n/backend/fallbacks.rb | 21 ++++++++++++--------- test/backend/fallbacks_test.rb | 4 ++++ 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/lib/i18n/backend/fallbacks.rb b/lib/i18n/backend/fallbacks.rb index bf36b211..f1cfd642 100644 --- a/lib/i18n/backend/fallbacks.rb +++ b/lib/i18n/backend/fallbacks.rb @@ -38,18 +38,21 @@ def translate(locale, key, options = {}) return super if options[:fallback] default = extract_non_symbol_default!(options) if options[:default] - options[:fallback] = true - I18n.fallbacks[locale].each do |fallback| - begin - catch(:exception) do - result = super(fallback, key, options) - return result if (result.nil? && options.key?(:default) && options[:default].nil?) || !result.nil? + begin + options[:fallback] = true + I18n.fallbacks[locale].each do |fallback| + begin + catch(:exception) do + result = super(fallback, key, options) + return result if (result.nil? && options.key?(:default) && options[:default].nil?) || !result.nil? + end + rescue I18n::InvalidLocale + # we do nothing when the locale is invalid, as this is a fallback anyways. end - rescue I18n::InvalidLocale - # we do nothing when the locale is invalid, as this is a fallback anyways. end + ensure + options.delete(:fallback) end - options.delete(:fallback) return super(locale, nil, options.merge(:default => default)) if default throw(:exception, I18n::MissingTranslation.new(locale, key, options)) diff --git a/test/backend/fallbacks_test.rb b/test/backend/fallbacks_test.rb index 76d2a798..4607619a 100644 --- a/test/backend/fallbacks_test.rb +++ b/test/backend/fallbacks_test.rb @@ -141,6 +141,10 @@ def setup assert_equal 'FOO', I18n.t(:foo, :locale => :'de-DE') end + test "falls back from de-DE to de when there is no translation for de-DE available when using arrays, too" do + assert_equal ['FOO', 'FOO'], I18n.t([:foo, :foo], :locale => :'de-DE') + end + test "should not raise error when enforce_available_locales is true, :'pt' is missing and default is a Symbol" do I18n.enforce_available_locales = true begin