From ef2bc12ceca73176b106172d46edd398083659a6 Mon Sep 17 00:00:00 2001 From: fatkodima Date: Fri, 12 Jan 2018 21:04:47 +0200 Subject: [PATCH] Fix issue with disabled subtrees and pluralization for KeyValue backend --- lib/i18n/backend/base.rb | 10 ++++---- lib/i18n/backend/key_value.rb | 46 +++++++++++++++++++++++++++++++++- test/backend/key_value_test.rb | 6 +++++ 3 files changed, 56 insertions(+), 6 deletions(-) diff --git a/lib/i18n/backend/base.rb b/lib/i18n/backend/base.rb index 0058c1a5..bf49a1d0 100644 --- a/lib/i18n/backend/base.rb +++ b/lib/i18n/backend/base.rb @@ -34,17 +34,17 @@ def translate(locale, key, options = {}) entry = resolve(locale, key, entry, options) end + entry = entry.dup if entry.is_a?(String) + + count = options[:count] + entry = pluralize(locale, entry, count) if count + if entry.nil? if (options.key?(:default) && !options[:default].nil?) || !options.key?(:default) throw(:exception, I18n::MissingTranslation.new(locale, key, options)) end end - entry = entry.dup if entry.is_a?(String) - - count = options[:count] - entry = pluralize(locale, entry, count) if count - deep_interpolation = options[:deep_interpolation] values = options.except(*RESERVED_KEYS) if values diff --git a/lib/i18n/backend/key_value.rb b/lib/i18n/backend/key_value.rb index b26cedf6..f26f4a7e 100644 --- a/lib/i18n/backend/key_value.rb +++ b/lib/i18n/backend/key_value.rb @@ -107,7 +107,51 @@ def lookup(locale, key, scope = [], options = {}) key = normalize_flat_keys(locale, key, scope, options[:separator]) value = @store["#{locale}.#{key}"] value = JSON.decode(value) if value - value.is_a?(Hash) ? value.deep_symbolize_keys : value + + if value.is_a?(Hash) + value.deep_symbolize_keys + elsif !value.nil? + value + elsif !@subtrees + SubtreeProxy.new("#{locale}.#{key}", @store) + end + end + end + + class SubtreeProxy + def initialize(master_key, store) + @master_key = master_key + @store = store + @subtree = nil + end + + def has_key?(key) + @subtree && @subtree.has_key?(key) || self[key] + end + + def [](key) + unless @subtree && value = @subtree[key] + value = @store["#{@master_key}.#{key}"] + (@subtree ||= {})[key] = JSON.decode(value) if value + end + value + end + + def is_a?(klass) + Hash == klass || super + end + alias :kind_of? :is_a? + + def instance_of?(klass) + Hash == klass || super + end + + def nil? + @subtree.nil? + end + + def inspect + @subtree.inspect end end diff --git a/test/backend/key_value_test.rb b/test/backend/key_value_test.rb index 097780df..6885efd2 100644 --- a/test/backend/key_value_test.rb +++ b/test/backend/key_value_test.rb @@ -40,4 +40,10 @@ def assert_flattens(expected, nested, escape=true, subtree=true) I18n.t("foo", :raise => true) end end + + test "translate handles subtrees for pluralization" do + setup_backend!(false) + store_translations(:en, :bar => { :one => "One" }) + assert_equal("One", I18n.t("bar", :count => 1)) + end end if I18n::TestCase.key_value?