From d1762c6c09e50cb1ed32cf2b4f0f525a0531094b Mon Sep 17 00:00:00 2001 From: fatkodima Date: Wed, 15 Nov 2023 00:48:24 +0200 Subject: [PATCH] Raise when translated entry contains interpolations for reserved keywords and no substitutions provided --- lib/i18n/backend/base.rb | 4 +++- lib/i18n/tests/interpolation.rb | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/i18n/backend/base.rb b/lib/i18n/backend/base.rb index 57756758..1e2fef02 100644 --- a/lib/i18n/backend/base.rb +++ b/lib/i18n/backend/base.rb @@ -55,12 +55,14 @@ def translate(locale, key, options = EMPTY_HASH) deep_interpolation = options[:deep_interpolation] values = Utils.except(options, *RESERVED_KEYS) unless options.empty? - if values + if values && !values.empty? entry = if deep_interpolation deep_interpolate(locale, entry, values) else interpolate(locale, entry, values) end + elsif entry.is_a?(String) && entry =~ I18n.reserved_keys_pattern + raise ReservedInterpolationKey.new($1.to_sym, entry) end entry end diff --git a/lib/i18n/tests/interpolation.rb b/lib/i18n/tests/interpolation.rb index 6bfe2e03..8123db25 100644 --- a/lib/i18n/tests/interpolation.rb +++ b/lib/i18n/tests/interpolation.rb @@ -112,6 +112,10 @@ module Interpolation assert_raises(I18n::ReservedInterpolationKey) { interpolate(:foo => :bar, :default => '%{default}') } assert_raises(I18n::ReservedInterpolationKey) { interpolate(:foo => :bar, :default => '%{separator}') } assert_raises(I18n::ReservedInterpolationKey) { interpolate(:foo => :bar, :default => '%{scope}') } + assert_raises(I18n::ReservedInterpolationKey) { interpolate(:default => '%{scope}') } + + I18n.backend.store_translations(:en, :interpolate => 'Hi %{scope}!') + assert_raises(I18n::ReservedInterpolationKey) { interpolate(:interpolate) } end test "interpolation: deep interpolation for default string" do