From 35d62a659b00e99caad536fcc764ce429411b9bb Mon Sep 17 00:00:00 2001 From: Natalie Tay Date: Wed, 11 Jun 2025 11:00:22 +0800 Subject: [PATCH] FIX: Skip edits if localization exists (#1422) We will fine tune updating an outdated localization in the future. For now we are seeing that quick edits are happening and we need to prevent the job from being too trigger-happy. --- app/jobs/regular/detect_translate_post.rb | 16 ++++++++++------ app/jobs/regular/detect_translate_topic.rb | 15 +++++++++------ .../regular/detect_translate_post_spec.rb | 19 +++++++++++++++++-- .../regular/detect_translate_topic_spec.rb | 18 ++++++++++++++++-- 4 files changed, 52 insertions(+), 16 deletions(-) diff --git a/app/jobs/regular/detect_translate_post.rb b/app/jobs/regular/detect_translate_post.rb index a5e812d7..7b50a464 100644 --- a/app/jobs/regular/detect_translate_post.rb +++ b/app/jobs/regular/detect_translate_post.rb @@ -20,12 +20,15 @@ module Jobs end end - begin - detected_locale = DiscourseAi::Translation::PostLocaleDetector.detect_locale(post) - rescue FinalDestination::SSRFDetector::LookupFailedError - # this job is non-critical - # the backfill job will handle failures - return + # the user may fill locale in manually + if (detected_locale = post.locale).blank? + begin + detected_locale = DiscourseAi::Translation::PostLocaleDetector.detect_locale(post) + rescue FinalDestination::SSRFDetector::LookupFailedError + # this job is non-critical + # the backfill job will handle failures + return + end end locales = SiteSetting.experimental_content_localization_supported_locales.split("|") @@ -33,6 +36,7 @@ module Jobs locales.each do |locale| next if locale == detected_locale + next if post.post_localizations.exists?(locale:) begin DiscourseAi::Translation::PostLocalizer.localize(post, locale) diff --git a/app/jobs/regular/detect_translate_topic.rb b/app/jobs/regular/detect_translate_topic.rb index ca5b4901..47ee26d0 100644 --- a/app/jobs/regular/detect_translate_topic.rb +++ b/app/jobs/regular/detect_translate_topic.rb @@ -18,12 +18,14 @@ module Jobs return if topic.category&.read_restricted? end - begin - detected_locale = DiscourseAi::Translation::TopicLocaleDetector.detect_locale(topic) - rescue FinalDestination::SSRFDetector::LookupFailedError - # this job is non-critical - # the backfill job will handle failures - return + if (detected_locale = topic.locale).blank? + begin + detected_locale = DiscourseAi::Translation::TopicLocaleDetector.detect_locale(topic) + rescue FinalDestination::SSRFDetector::LookupFailedError + # this job is non-critical + # the backfill job will handle failures + return + end end locales = SiteSetting.experimental_content_localization_supported_locales.split("|") @@ -31,6 +33,7 @@ module Jobs locales.each do |locale| next if locale == detected_locale + next if topic.topic_localizations.exists?(locale:) begin DiscourseAi::Translation::TopicLocalizer.localize(topic, locale) diff --git a/spec/jobs/regular/detect_translate_post_spec.rb b/spec/jobs/regular/detect_translate_post_spec.rb index b3fd6187..21b05a70 100644 --- a/spec/jobs/regular/detect_translate_post_spec.rb +++ b/spec/jobs/regular/detect_translate_post_spec.rb @@ -39,6 +39,14 @@ describe Jobs::DetectTranslatePost do job.execute({ post_id: post.id }) end + it "skips locale detection when post has a locale" do + post.update!(locale: "en") + DiscourseAi::Translation::PostLocaleDetector.expects(:detect_locale).with(post).never + DiscourseAi::Translation::PostLocalizer.expects(:localize).with(post, "ja").once + + job.execute({ post_id: post.id }) + end + it "skips bot posts" do post.update!(user: Discourse.system_user) DiscourseAi::Translation::PostLocalizer.expects(:localize).never @@ -56,16 +64,23 @@ describe Jobs::DetectTranslatePost do it "skips translating to the post's language" do post.update(locale: "en") - DiscourseAi::Translation::PostLocaleDetector.expects(:detect_locale).with(post).returns("en") DiscourseAi::Translation::PostLocalizer.expects(:localize).with(post, "en").never DiscourseAi::Translation::PostLocalizer.expects(:localize).with(post, "ja").once job.execute({ post_id: post.id }) end + it "skips translating if the post is already localized" do + post.update(locale: "en") + Fabricate(:post_localization, post: post, locale: "ja") + + DiscourseAi::Translation::PostLocalizer.expects(:localize).never + + job.execute({ post_id: post.id }) + end + it "handles translation errors gracefully" do post.update(locale: "en") - DiscourseAi::Translation::PostLocaleDetector.expects(:detect_locale).with(post).returns("en") DiscourseAi::Translation::PostLocalizer.expects(:localize).raises( StandardError.new("API error"), ) diff --git a/spec/jobs/regular/detect_translate_topic_spec.rb b/spec/jobs/regular/detect_translate_topic_spec.rb index 7b397b1b..fca842f1 100644 --- a/spec/jobs/regular/detect_translate_topic_spec.rb +++ b/spec/jobs/regular/detect_translate_topic_spec.rb @@ -39,6 +39,14 @@ describe Jobs::DetectTranslateTopic do job.execute({ topic_id: topic.id }) end + it "skips locale detection when topic has a locale" do + topic.update!(locale: "en") + DiscourseAi::Translation::TopicLocaleDetector.expects(:detect_locale).with(topic).never + DiscourseAi::Translation::TopicLocalizer.expects(:localize).with(topic, "ja").once + + job.execute({ topic_id: topic.id }) + end + it "skips bot topics" do topic.update!(user: Discourse.system_user) DiscourseAi::Translation::TopicLocalizer.expects(:localize).never @@ -56,16 +64,22 @@ describe Jobs::DetectTranslateTopic do it "skips translating to the topic's language" do topic.update(locale: "en") - DiscourseAi::Translation::TopicLocaleDetector.expects(:detect_locale).with(topic).returns("en") DiscourseAi::Translation::TopicLocalizer.expects(:localize).with(topic, "en").never DiscourseAi::Translation::TopicLocalizer.expects(:localize).with(topic, "ja").once job.execute({ topic_id: topic.id }) end + it "skips translating if the topic is already localized" do + topic.update(locale: "en") + Fabricate(:topic_localization, topic:, locale: "ja") + DiscourseAi::Translation::TopicLocalizer.expects(:localize).never + + job.execute({ topic_id: topic.id }) + end + it "handles translation errors gracefully" do topic.update(locale: "en") - DiscourseAi::Translation::TopicLocaleDetector.expects(:detect_locale).with(topic).returns("en") DiscourseAi::Translation::TopicLocalizer.expects(:localize).raises( StandardError.new("API error"), )