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"), )