From dfd1e29dddeea88a3015b8b1c7ce2b40991a2af8 Mon Sep 17 00:00:00 2001 From: Ryan Bigg Date: Wed, 15 Jul 2020 09:40:31 +1000 Subject: [PATCH 1/2] Ensure documentation for fallbacks reflects reality --- lib/i18n/locale/fallbacks.rb | 2 +- test/locale/fallbacks_test.rb | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/i18n/locale/fallbacks.rb b/lib/i18n/locale/fallbacks.rb index dee99172..94909aad 100644 --- a/lib/i18n/locale/fallbacks.rb +++ b/lib/i18n/locale/fallbacks.rb @@ -26,7 +26,7 @@ # # I18n.default_locale = :"en-US" # I18n.fallbacks = I18n::Locale::Fallbacks.new(:"de-AT" => :"de-DE") -# I18n.fallbacks[:"de-AT"] # => [:"de-AT", :"de-DE", :de, :"en-US", :en] +# I18n.fallbacks[:"de-AT"] # => [:"de-AT", :de, :"de-DE"] # # # using a custom locale as default fallback locale # diff --git a/test/locale/fallbacks_test.rb b/test/locale/fallbacks_test.rb index a2b1c5b2..8e2a2b47 100644 --- a/test/locale/fallbacks_test.rb +++ b/test/locale/fallbacks_test.rb @@ -9,6 +9,19 @@ class I18nFallbacksDefaultsTest < I18n::TestCase assert_equal [], fallbacks.defaults end + test "documentation example #1 - does not use default locale in fallbacks - See Issues #413 & #415" do + I18n.default_locale = :"en-US" + fallbacks = Fallbacks.new(:"de-AT" => :"de-DE") + assert_equal [:"de-AT", :de, :"de-DE"], fallbacks[:"de-AT"] + end + + test "documentation example #2 - does not use default locale in fallbacks - Uses custom locale - See Issues #413 & #415" do + I18n.default_locale = :"en-US" + fallbacks = Fallbacks.new(:"en-GB", :"de-AT" => :de, :"de-CH" => :de) + assert_equal [:"de-AT", :de, :"en-GB", :en], fallbacks[:"de-AT"] + assert_equal [:"de-CH", :de, :"en-GB", :en], fallbacks[:"de-CH"] + end + test "defaults reflect a manually passed default locale if any" do fallbacks = Fallbacks.new(:'fi-FI') assert_equal [:'fi-FI', :fi], fallbacks.defaults From 1cb0987c8ab2ce4eefcd2310c55ceb62954fccb2 Mon Sep 17 00:00:00 2001 From: Ryan Bigg Date: Wed, 15 Jul 2020 10:05:16 +1000 Subject: [PATCH 2/2] Always instantiate I18n::Locale::Fallbacks objects when using I18n.fallbacks= --- lib/i18n/backend/fallbacks.rb | 2 +- test/backend/fallbacks_test.rb | 19 +++++++++++++++++++ test/locale/fallbacks_test.rb | 7 +++++++ test/test_helper.rb | 1 + 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/lib/i18n/backend/fallbacks.rb b/lib/i18n/backend/fallbacks.rb index 7188a82c..40ff1220 100644 --- a/lib/i18n/backend/fallbacks.rb +++ b/lib/i18n/backend/fallbacks.rb @@ -20,7 +20,7 @@ def fallbacks # Sets the current fallbacks implementation. Use this to set a different fallbacks implementation. def fallbacks=(fallbacks) - @@fallbacks = fallbacks + @@fallbacks = fallbacks.is_a?(I18n::Locale::Fallbacks) ? fallbacks : I18n::Locale::Fallbacks.new(fallbacks) end end diff --git a/test/backend/fallbacks_test.rb b/test/backend/fallbacks_test.rb index b7246877..37477116 100644 --- a/test/backend/fallbacks_test.rb +++ b/test/backend/fallbacks_test.rb @@ -109,6 +109,25 @@ def setup end end +# See Issue #534 +class I18nBackendFallbacksLocalizeTestWithDefaultLocale < I18n::TestCase + class Backend < I18n::Backend::Simple + include I18n::Backend::Fallbacks + end + + def setup + super + I18n.backend = Backend.new + I18n.enforce_available_locales = false + I18n.fallbacks = [I18n.default_locale] + store_translations(:en, time: { formats: { fallback: 'en fallback' } }) + end + + test "falls back to default locale - Issue #534" do + assert_equal 'en fallback', I18n.l(Time.now, format: :fallback, locale: "un-supported") + end +end + class I18nBackendFallbacksLocalizeTest < I18n::TestCase class Backend < I18n::Backend::Simple include I18n::Backend::Fallbacks diff --git a/test/locale/fallbacks_test.rb b/test/locale/fallbacks_test.rb index 8e2a2b47..dbfca921 100644 --- a/test/locale/fallbacks_test.rb +++ b/test/locale/fallbacks_test.rb @@ -22,6 +22,13 @@ class I18nFallbacksDefaultsTest < I18n::TestCase assert_equal [:"de-CH", :de, :"en-GB", :en], fallbacks[:"de-CH"] end + test "explicit fallback to default locale" do + I18n.default_locale = :"en-US" + fallbacks = Fallbacks.new([:"en-US"]) + assert_equal [:"de-AT", :de, :"en-US", :en], fallbacks[:"de-AT"] + assert_equal [:"de-CH", :de, :"en-US", :en], fallbacks[:"de-CH"] + end + test "defaults reflect a manually passed default locale if any" do fallbacks = Fallbacks.new(:'fi-FI') assert_equal [:'fi-FI', :fi], fallbacks.defaults diff --git a/test/test_helper.rb b/test/test_helper.rb index d4a8488f..8477fef5 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -34,6 +34,7 @@ def teardown I18n.backend = nil I18n.default_separator = nil I18n.enforce_available_locales = true + I18n.fallbacks = nil super end