FIX: Pluralized translation overrides didn't work for en_US

"en_US" doesn't contain most of the translations, so it falls back to "en". But that behavior stopped translation overrides to work for pluralized strings in "en_US", because it relies on existing translations. This fixes it by looking up the existing translation in all fallback locales.
This commit is contained in:
Gerhard Schlager 2020-08-29 00:11:45 +02:00
parent 7353a4c64a
commit ce1620f2ad
No known key found for this signature in database
GPG Key ID: 943644A1A201E402
3 changed files with 33 additions and 15 deletions

View File

@ -82,20 +82,29 @@ module I18n
overrides = options.dig(:overrides, locale)
if overrides
if existing_translations && options[:count]
remapped_translations =
if existing_translations.is_a?(Hash)
Hash[existing_translations.map { |k, v| ["#{key}.#{k}", v] }]
elsif existing_translations.is_a?(String)
Hash[[[key, existing_translations]]]
if options[:count]
if !existing_translations
I18n.fallbacks[locale].drop(1).each do |fallback|
existing_translations = super(fallback, key, scope, options)
break if existing_translations.present?
end
result = {}
remapped_translations.merge(overrides).each do |k, v|
result[k.split('.').last.to_sym] = v if k != key && k.start_with?(key.to_s)
end
return result if result.size > 0
if existing_translations
remapped_translations =
if existing_translations.is_a?(Hash)
Hash[existing_translations.map { |k, v| ["#{key}.#{k}", v] }]
elsif existing_translations.is_a?(String)
Hash[[[key, existing_translations]]]
end
result = {}
remapped_translations.merge(overrides).each do |k, v|
result[k.split('.').last.to_sym] = v if k != key && k.start_with?(key.to_s)
end
return result if result.size > 0
end
end
return overrides[key] if overrides[key]
@ -103,7 +112,6 @@ module I18n
existing_translations
end
end
end
end

View File

@ -172,6 +172,16 @@ describe "translate accelerator" do
expect(I18n.t('items', count: 1)).to eq('one fish')
end
it "supports one and other with fallback locale" do
override_translation('en_US', 'items.one', 'one fish')
override_translation('en_US', 'items.other', '%{count} fishies')
I18n.with_locale(:en_US) do
expect(I18n.t('items', count: 13)).to eq('13 fishies')
expect(I18n.t('items', count: 1)).to eq('one fish')
end
end
it "supports one and other when only a single pluralization key is overridden" do
override_translation('en', 'keys.magic.other', 'no magic keys')
expect(I18n.t('keys.magic', count: 1)).to eq('one magic key')

View File

@ -94,14 +94,14 @@ describe EmailStyle do
context 'translation override' do
before do
TranslationOverride.upsert!(
'en',
SiteSetting.default_locale,
'user_notifications.signup.text_body_template',
"CLICK THAT LINK: %{base_url}/u/activate-account/%{email_token}"
)
end
after do
TranslationOverride.revert!('en', ['user_notifications.signup.text_body_template'])
TranslationOverride.revert!(SiteSetting.default_locale, ['user_notifications.signup.text_body_template'])
end
it "applies customizations when translation override exists" do