FIX: Restoring backup didn't clear cached translation overrides

This commit is contained in:
Gerhard Schlager 2020-05-18 18:45:47 +02:00
parent 27c611b1d1
commit 6d5e9db883
3 changed files with 58 additions and 15 deletions

View File

@ -38,6 +38,16 @@ class TranslationOverride < ActiveRecord::Base
i18n_changed(locale, keys) i18n_changed(locale, keys)
end end
def self.reload_all_overrides!
reload_locale!
overrides = TranslationOverride.pluck(:locale, :translation_key)
overrides = overrides.group_by(&:first).map { |k, a| [k, a.map(&:last)] }
overrides.each do |locale, keys|
clear_cached_keys!(locale, keys)
end
end
def self.reload_locale! def self.reload_locale!
I18n.reload! I18n.reload!
ExtraLocalesController.clear_cache! ExtraLocalesController.clear_cache!

View File

@ -55,6 +55,7 @@ module BackupRestore
clear_category_cache clear_category_cache
clear_emoji_cache clear_emoji_cache
clear_theme_cache clear_theme_cache
reload_translations
@uploads_restorer.restore(@tmp_directory) @uploads_restorer.restore(@tmp_directory)
@ -131,6 +132,11 @@ module BackupRestore
Emoji.clear_cache Emoji.clear_cache
end end
def reload_translations
log "Reloading translations..."
TranslationOverride.reload_all_overrides!
end
def notify_user def notify_user
if user = User.find_by_email(@user_info[:email]) if user = User.find_by_email(@user_info[:email])
log "Notifying '#{user.username}' of the end of the restore..." log "Notifying '#{user.username}' of the end of the restore..."

View File

@ -92,8 +92,10 @@ describe TranslationOverride do
end end
context "site cache" do context "site cache" do
def cached_value(guardian, types_name, name_key, attribute) def cached_value(guardian, translation_key, locale:)
I18n.with_locale(:en) do types_name, name_key, attribute = translation_key.split('.')
I18n.with_locale(locale) do
json = Site.json_for(guardian) json = Site.json_for(guardian)
JSON.parse(json)[types_name] JSON.parse(json)[types_name]
@ -101,33 +103,29 @@ describe TranslationOverride do
end end
end end
let!(:anon_guardian) { Guardian.new }
let!(:user_guardian) { Guardian.new(Fabricate(:user)) }
shared_examples "resets site text" do shared_examples "resets site text" do
it "resets the site cache when translations of post_action_types are changed" do it "resets the site cache when translations of post_action_types are changed" do
anon_guardian = Guardian.new
user_guardian = Guardian.new(Fabricate(:user))
I18n.locale = :de I18n.locale = :de
translation_keys.each do |translation_key| translation_keys.each do |translation_key|
original_value = I18n.t(translation_key, locale: 'en') original_value = I18n.t(translation_key, locale: 'en')
types_name, name_key, attribute = translation_key.split('.') expect(cached_value(user_guardian, translation_key, locale: 'en')).to eq(original_value)
expect(cached_value(anon_guardian, translation_key, locale: 'en')).to eq(original_value)
expect(cached_value(user_guardian, types_name, name_key, attribute)).to eq(original_value)
expect(cached_value(anon_guardian, types_name, name_key, attribute)).to eq(original_value)
TranslationOverride.upsert!('en', translation_key, 'bar') TranslationOverride.upsert!('en', translation_key, 'bar')
expect(cached_value(user_guardian, types_name, name_key, attribute)).to eq('bar') expect(cached_value(user_guardian, translation_key, locale: 'en')).to eq('bar')
expect(cached_value(anon_guardian, types_name, name_key, attribute)).to eq('bar') expect(cached_value(anon_guardian, translation_key, locale: 'en')).to eq('bar')
end end
TranslationOverride.revert!('en', translation_keys) TranslationOverride.revert!('en', translation_keys)
translation_keys.each do |translation_key| translation_keys.each do |translation_key|
original_value = I18n.t(translation_key, locale: 'en') original_value = I18n.t(translation_key, locale: 'en')
types_name, name_key, attribute = translation_key.split('.') expect(cached_value(user_guardian, translation_key, locale: 'en')).to eq(original_value)
expect(cached_value(anon_guardian, translation_key, locale: 'en')).to eq(original_value)
expect(cached_value(user_guardian, types_name, name_key, attribute)).to eq(original_value)
expect(cached_value(anon_guardian, types_name, name_key, attribute)).to eq(original_value)
end end
end end
end end
@ -149,5 +147,34 @@ describe TranslationOverride do
include_examples "resets site text" include_examples "resets site text"
end end
describe "#reload_all_overrides!" do
it "correctly reloads all translation overrides" do
original_en_topics = I18n.t("topics", locale: :en)
original_en_emoji = I18n.t("js.composer.emoji", locale: :en)
original_en_offtopic_description = I18n.t("post_action_types.off_topic.description", locale: :en)
original_de_likes = I18n.t("likes", locale: :de)
TranslationOverride.create!(locale: "en", translation_key: "topics", value: "Threads")
TranslationOverride.create!(locale: "en", translation_key: "js.composer.emoji", value: "Smilies")
TranslationOverride.create!(locale: "en", translation_key: "post_action_types.off_topic.description", value: "Overridden description")
TranslationOverride.create!(locale: "de", translation_key: "likes", value: "„Gefällt mir“-Angaben")
expect(I18n.t("topics", locale: :en)).to eq(original_en_topics)
expect(I18n.t("js.composer.emoji", locale: :en)).to eq(original_en_emoji)
expect(cached_value(anon_guardian, "post_action_types.off_topic.description", locale: :en)).to eq(original_en_offtopic_description)
expect(I18n.t("likes", locale: :de)).to eq(original_de_likes)
TranslationOverride.reload_all_overrides!
expect(I18n.t("topics", locale: :en)).to eq("Threads")
expect(I18n.t("js.composer.emoji", locale: :en)).to eq("Smilies")
expect(cached_value(anon_guardian, "post_action_types.off_topic.description", locale: :en)).to eq("Overridden description")
expect(I18n.t("likes", locale: :de)).to eq("„Gefällt mir“-Angaben")
TranslationOverride.revert!(:en, ["topics", "js.composer.emoji", "post_action_types.off_topic.description"])
TranslationOverride.revert!(:de, ["likes"])
end
end
end end
end end