From 8ada2c430f1dbbcbb888bc99d54a547ff2abda37 Mon Sep 17 00:00:00 2001 From: Kang Zhang Date: Thu, 12 Mar 2020 16:44:14 +0800 Subject: [PATCH] Provide "I18n::Backend::Fallbacks#on_fallback" hook to allow users to add specified logic when the fallback succeeds. --- lib/i18n/backend/fallbacks.rb | 12 +++++++++++- test/backend/fallbacks_test.rb | 31 +++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/lib/i18n/backend/fallbacks.rb b/lib/i18n/backend/fallbacks.rb index 6e4b5c69..42353430 100644 --- a/lib/i18n/backend/fallbacks.rb +++ b/lib/i18n/backend/fallbacks.rb @@ -46,7 +46,10 @@ def translate(locale, key, options = EMPTY_HASH) begin catch(:exception) do result = super(fallback, key, fallback_options) - return result unless result.nil? + unless result.nil? + on_fallback(locale, fallback, key, options) + return result + end end rescue I18n::InvalidLocale # we do nothing when the locale is invalid, as this is a fallback anyways. @@ -80,6 +83,13 @@ def exists?(locale, key, options = EMPTY_HASH) false end + + private + + # Overwrite on_fallback to add specified logic when the fallback succeeds. + def on_fallback(_original_locale, _fallback_locale, _key, _optoins) + nil + end end end end diff --git a/test/backend/fallbacks_test.rb b/test/backend/fallbacks_test.rb index 1f7be70a..2e40611c 100644 --- a/test/backend/fallbacks_test.rb +++ b/test/backend/fallbacks_test.rb @@ -227,3 +227,34 @@ def setup assert_equal false, I18n.exists?(:bar, :'de-DE-XX', fallback: false) end end + +class I18nBackendOnFallbackHookTest < I18n::TestCase + class Backend < I18n::Backend::Simple + include I18n::Backend::Fallbacks + + attr :fallback_collector + + private + + def on_fallback(*args) + @fallback_collector ||= [] + @fallback_collector << args + end + end + + def setup + super + I18n.backend = Backend.new + I18n.fallbacks = I18n::Locale::Fallbacks.new(de: :en) + store_translations(:en, :foo => 'Foo in :en', :bar => 'Bar in :en') + store_translations(:de, :bar => 'Bar in :de') + end + + test "on_fallback should be called when fallback happens" do + assert_equal [:"de-DE", :de, :en], I18n.fallbacks[:"de-DE"] + assert_equal 'Bar in :de', I18n.t(:bar, locale: :'de-DE') + assert_equal 'Foo in :en', I18n.t(:foo, locale: :'de-DE') + assert_equal [:'de-DE', :de, :bar, {}], I18n.backend.fallback_collector[0] + assert_equal [:'de-DE', :en, :foo, {}], I18n.backend.fallback_collector[1] + end +end