diff --git a/.discourse-compatibility b/.discourse-compatibility index 44e5580a..0b92c4a8 100644 --- a/.discourse-compatibility +++ b/.discourse-compatibility @@ -1,3 +1,4 @@ +< 3.5.0.beta6-dev: 7e0a51707f98eb8ec49fa39c519075b1766d54be < 3.5.0.beta5-dev: 5c44f829ef82ded3416b0cddc521e9e6d62ed534 < 3.5.0.beta4-dev: 14ca3c07efa0a80712a4cbb8ca455c32a727adec < 3.5.0.beta2-dev: 5f24835801fdc7cb98e1bcf42d2ab2e49e609921 diff --git a/app/jobs/regular/detect_translate_post.rb b/app/jobs/regular/detect_translate_post.rb index e43f7abe..a264d49f 100644 --- a/app/jobs/regular/detect_translate_post.rb +++ b/app/jobs/regular/detect_translate_post.rb @@ -25,7 +25,7 @@ def execute(args) return end - locales = SiteSetting.automatic_translation_target_languages.split("|") + locales = SiteSetting.experimental_content_localization_supported_locales.split("|") return if locales.blank? locales.each do |locale| diff --git a/app/jobs/regular/detect_translate_topic.rb b/app/jobs/regular/detect_translate_topic.rb index a93743e0..8dda4edb 100644 --- a/app/jobs/regular/detect_translate_topic.rb +++ b/app/jobs/regular/detect_translate_topic.rb @@ -26,7 +26,7 @@ def execute(args) return end - locales = SiteSetting.automatic_translation_target_languages.split("|") + locales = SiteSetting.experimental_content_localization_supported_locales.split("|") return if locales.blank? locales.each do |locale| diff --git a/app/jobs/regular/translate_categories.rb b/app/jobs/regular/translate_categories.rb index d6745dbc..16fcce2a 100644 --- a/app/jobs/regular/translate_categories.rb +++ b/app/jobs/regular/translate_categories.rb @@ -11,7 +11,7 @@ def execute(args) return unless SiteSetting.translator_enabled return unless SiteSetting.experimental_content_translation - locales = SiteSetting.automatic_translation_target_languages.split("|") + locales = SiteSetting.experimental_content_localization_supported_locales.split("|") return if locales.blank? cat_id = args[:from_category_id] || Category.order(:id).first&.id diff --git a/app/jobs/regular/translate_posts.rb b/app/jobs/regular/translate_posts.rb index 13a3dfc7..af0be11c 100644 --- a/app/jobs/regular/translate_posts.rb +++ b/app/jobs/regular/translate_posts.rb @@ -11,7 +11,7 @@ def execute(args) return unless SiteSetting.translator_enabled return unless SiteSetting.experimental_content_translation - locales = SiteSetting.automatic_translation_target_languages.split("|") + locales = SiteSetting.experimental_content_localization_supported_locales.split("|") return if locales.blank? limit = args[:limit] || BATCH_SIZE diff --git a/app/jobs/regular/translate_topics.rb b/app/jobs/regular/translate_topics.rb index adc718e7..a91d3069 100644 --- a/app/jobs/regular/translate_topics.rb +++ b/app/jobs/regular/translate_topics.rb @@ -11,7 +11,7 @@ def execute(args) return unless SiteSetting.translator_enabled return unless SiteSetting.experimental_content_translation - locales = SiteSetting.automatic_translation_target_languages.split("|") + locales = SiteSetting.experimental_content_localization_supported_locales.split("|") return if locales.blank? limit = args[:limit] || BATCH_SIZE diff --git a/app/jobs/scheduled/category_translation_backfill.rb b/app/jobs/scheduled/category_translation_backfill.rb index 0463edfc..0d8125bf 100644 --- a/app/jobs/scheduled/category_translation_backfill.rb +++ b/app/jobs/scheduled/category_translation_backfill.rb @@ -9,8 +9,7 @@ def execute(args) return unless SiteSetting.translator_enabled return unless SiteSetting.experimental_content_translation - locales = SiteSetting.automatic_translation_target_languages.split("|") - return if locales.blank? + return if SiteSetting.experimental_content_localization_supported_locales.blank? Jobs.enqueue(:translate_categories) end diff --git a/app/jobs/scheduled/post_translation_backfill.rb b/app/jobs/scheduled/post_translation_backfill.rb index a5a6c67c..6cbd96b3 100644 --- a/app/jobs/scheduled/post_translation_backfill.rb +++ b/app/jobs/scheduled/post_translation_backfill.rb @@ -9,7 +9,7 @@ def execute(args) return unless SiteSetting.translator_enabled return unless SiteSetting.experimental_content_translation - return if SiteSetting.automatic_translation_target_languages.blank? + return if SiteSetting.experimental_content_localization_supported_locales.blank? return if SiteSetting.automatic_translation_backfill_rate == 0 Jobs.enqueue(:translate_posts, limit: SiteSetting.automatic_translation_backfill_rate) diff --git a/app/jobs/scheduled/topic_translation_backfill.rb b/app/jobs/scheduled/topic_translation_backfill.rb index 0e5f3757..904c88b2 100644 --- a/app/jobs/scheduled/topic_translation_backfill.rb +++ b/app/jobs/scheduled/topic_translation_backfill.rb @@ -9,7 +9,7 @@ def execute(args) return unless SiteSetting.translator_enabled return unless SiteSetting.experimental_content_translation - return if SiteSetting.automatic_translation_target_languages.blank? + return if SiteSetting.experimental_content_localization_supported_locales.blank? return if SiteSetting.automatic_translation_backfill_rate == 0 Jobs.enqueue(:translate_topics, limit: SiteSetting.automatic_translation_backfill_rate) diff --git a/assets/javascripts/discourse/components/language-switcher.gjs b/assets/javascripts/discourse/components/language-switcher.gjs deleted file mode 100644 index f4aedc8d..00000000 --- a/assets/javascripts/discourse/components/language-switcher.gjs +++ /dev/null @@ -1,67 +0,0 @@ -import Component from "@glimmer/component"; -import { fn } from "@ember/helper"; -import { action } from "@ember/object"; -import { service } from "@ember/service"; -import DButton from "discourse/components/d-button"; -import DropdownMenu from "discourse/components/dropdown-menu"; -import cookie from "discourse/lib/cookie"; -import DMenu from "float-kit/components/d-menu"; - -export default class LanguageSwitcher extends Component { - @service site; - @service siteSettings; - @service router; - - get localeOptions() { - const targetLanguages = ( - this.siteSettings.automatic_translation_target_languages || "" - ).split("|"); - return JSON.parse(this.siteSettings.available_locales) - .filter(({ value }) => targetLanguages.includes(value)) - .map(({ name, value }) => { - return { - label: name, - value, - }; - }); - } - - @action - async changeLocale(locale) { - cookie("locale", locale, { path: "/" }); - this.dMenu.close(); - // we need a hard refresh here for the locale to take effect - window.location.reload(); - } - - @action - onRegisterApi(api) { - this.dMenu = api; - } - - -} diff --git a/assets/javascripts/discourse/components/show-original-content.gjs b/assets/javascripts/discourse/components/show-original-content.gjs deleted file mode 100644 index 2bacb265..00000000 --- a/assets/javascripts/discourse/components/show-original-content.gjs +++ /dev/null @@ -1,59 +0,0 @@ -import Component from "@glimmer/component"; -import { tracked } from "@glimmer/tracking"; -import { action } from "@ember/object"; -import { service } from "@ember/service"; -import DButton from "discourse/components/d-button"; -import concatClass from "discourse/helpers/concat-class"; -import cookie, { removeCookie } from "discourse/lib/cookie"; - -const SHOW_ORIGINAL_COOKIE = "discourse-translator-show-original"; -const SHOW_ORIGINAL_COOKIE_EXPIRY = 30; - -export default class ShowOriginalContent extends Component { - static shouldRender(args) { - return args.topic.show_translation_toggle; - } - - @service router; - - @tracked showingOriginal = false; - - constructor() { - super(...arguments); - this.showingOriginal = cookie(SHOW_ORIGINAL_COOKIE); - } - - @action - async showOriginal() { - if (this.showingOriginal) { - removeCookie(SHOW_ORIGINAL_COOKIE, { path: "/" }); - } else { - cookie(SHOW_ORIGINAL_COOKIE, true, { - path: "/", - expires: SHOW_ORIGINAL_COOKIE_EXPIRY, - }); - } - - this.router.refresh(); - } - - get title() { - return this.showingOriginal - ? "translator.content_not_translated" - : "translator.content_translated"; - } - - -} diff --git a/assets/javascripts/discourse/initializers/extend-for-translate-button.js b/assets/javascripts/discourse/initializers/extend-for-translate-button.js index f11bafa2..9d81cb58 100644 --- a/assets/javascripts/discourse/initializers/extend-for-translate-button.js +++ b/assets/javascripts/discourse/initializers/extend-for-translate-button.js @@ -1,5 +1,4 @@ import { withPluginApi } from "discourse/lib/plugin-api"; -import LanguageSwitcher from "../components/language-switcher"; import ToggleTranslationButton from "../components/post-menu/toggle-translation-button"; import TranslatedPost from "../components/translated-post"; @@ -9,20 +8,6 @@ function initializeTranslation(api) { return; } - const currentUser = api.getCurrentUser(); - - if ( - !currentUser && - siteSettings.experimental_anon_language_switcher && - siteSettings.automatic_translation_target_languages - ) { - api.headerIcons.add( - "discourse-translator_language-switcher", - LanguageSwitcher, - { before: ["search"] } - ); - } - customizePostMenu(api); } diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index c78afefb..886c63eb 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -17,11 +17,6 @@ en: translator_azure_custom_subdomain: "Required if using a Virtual Network or Firewall for Azure Cognitive Services. Note: Only enter the custom subdomain not the full custom endpoint." restrict_translation_by_group: "Only allowed groups can translate" restrict_translation_by_poster_group: "Only allow translation of posts made by users in allowed groups. If empty, allow translations of posts from all users." - experimental_anon_language_switcher: "Enable experimental language switcher. This will allow site visitors who are not logged in to switch between translated versions of Discourse and user-contributed content in topics." - errors: - needs_nonzero_backfill: "Automatic language translation requires the 'automatic_translation_backfill_rate' hidden setting to be a non-zero value. Please approach your site administrator to increase this limit." - experimental_anon_language_switcher_requirements: "The experimental language switcher requires the `set locale from cookie` site setting to be enabled, and the `automatic translation target languages` to have at least one language." - automatic_translation_target_languages: "The languages to automatically translate user content (posts, topics) to. If empty, no languages will be automatically translated." translator: failed: topic: "The translator is unable to translate this topic's title (%{source_locale}) to your language (%{target_locale})." diff --git a/config/settings.yml b/config/settings.yml index 4a324e35..7a12e385 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -14,14 +14,6 @@ discourse_translator: - Yandex - LibreTranslate validator: "DiscourseTranslator::Validators::TranslatorSelectionValidator" - automatic_translation_target_languages: - default: "" - type: list - client: true - list_type: named - allow_any: false - choices: "DiscourseTranslator::TranslatableLanguagesSetting.values" - validator: "DiscourseTranslator::Validators::TranslatableLanguagesValidator" automatic_translation_backfill_rate: default: 0 client: false @@ -122,10 +114,6 @@ discourse_translator: default: "" client: true type: group_list - experimental_anon_language_switcher: - default: false - client: true - validator: "DiscourseTranslator::Validators::LanguageSwitcherSettingValidator" experimental_content_translation: default: false hidden: true diff --git a/db/migrate/20250528040217_rename_translation_target_languages_to_content_localization_supported_locales.rb b/db/migrate/20250528040217_rename_translation_target_languages_to_content_localization_supported_locales.rb new file mode 100644 index 00000000..c0d8ce4f --- /dev/null +++ b/db/migrate/20250528040217_rename_translation_target_languages_to_content_localization_supported_locales.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +class RenameTranslationTargetLanguagesToContentLocalizationSupportedLocales < ActiveRecord::Migration[ + 7.2 +] + def up + setting_exists = + DB.query_single( + "SELECT 1 FROM site_settings WHERE name = 'experimental_content_localization_supported_locales' LIMIT 1", + ).present? + + if setting_exists + execute "DELETE FROM site_settings WHERE name = 'automatic_translation_target_languages'" + else + execute "UPDATE site_settings SET name = 'experimental_content_localization_supported_locales' WHERE name = 'automatic_translation_target_languages'" + end + end + + def down + raise ActiveRecord::IrreversibleMigration + end +end diff --git a/lib/discourse_translator/parallel_text_translation.rb b/lib/discourse_translator/parallel_text_translation.rb index c2cc72fe..5b458631 100644 --- a/lib/discourse_translator/parallel_text_translation.rb +++ b/lib/discourse_translator/parallel_text_translation.rb @@ -3,20 +3,14 @@ module DiscourseTranslator class ParallelTextTranslation def inject(plugin) - # in parallel text translations, - # we don't want to send the post for detection if automatic translation already happens, - # as automatic translations send content for language detection as a side effect of translating - plugin.on(:post_process_cooked) do |_, post| - if SiteSetting.automatic_translation_target_languages.blank? && - Guardian.new.can_detect_language?(post) && post.user_id > 0 + if Guardian.new.can_detect_language?(post) && post.user_id > 0 Jobs.enqueue(:detect_translatable_language, type: "Post", translatable_id: post.id) end end plugin.on(:topic_created) do |topic| - if SiteSetting.automatic_translation_target_languages.blank? && - Guardian.new.can_detect_language?(topic.first_post) && topic.user_id > 0 + if Guardian.new.can_detect_language?(topic.first_post) && topic.user_id > 0 Jobs.enqueue(:detect_translatable_language, type: "Topic", translatable_id: topic.id) end end diff --git a/lib/discourse_translator/validators/language_switcher_setting_validator.rb b/lib/discourse_translator/validators/language_switcher_setting_validator.rb deleted file mode 100644 index de13c83b..00000000 --- a/lib/discourse_translator/validators/language_switcher_setting_validator.rb +++ /dev/null @@ -1,21 +0,0 @@ -# frozen_string_literal: true - -module DiscourseTranslator - module Validators - class LanguageSwitcherSettingValidator - def initialize(opts = {}) - @opts = opts - end - - def valid_value?(val) - return true if val == "f" || val == "false" - SiteSetting.set_locale_from_cookie && - SiteSetting.automatic_translation_target_languages.present? - end - - def error_message - I18n.t("site_settings.errors.experimental_anon_language_switcher_requirements") - end - end - end -end diff --git a/lib/discourse_translator/validators/translatable_languages_validator.rb b/lib/discourse_translator/validators/translatable_languages_validator.rb deleted file mode 100644 index 0e3df8d9..00000000 --- a/lib/discourse_translator/validators/translatable_languages_validator.rb +++ /dev/null @@ -1,21 +0,0 @@ -# frozen_string_literal: true - -module DiscourseTranslator - module Validators - class TranslatableLanguagesValidator - def initialize(opts = {}) - @opts = opts - end - - def valid_value?(val) - return true if val.blank? - - SiteSetting.automatic_translation_backfill_rate > 0 - end - - def error_message - I18n.t("site_settings.errors.needs_nonzero_backfill") - end - end - end -end diff --git a/spec/jobs/detect_translate_post_spec.rb b/spec/jobs/detect_translate_post_spec.rb index 20c58b4c..6838aef9 100644 --- a/spec/jobs/detect_translate_post_spec.rb +++ b/spec/jobs/detect_translate_post_spec.rb @@ -10,7 +10,7 @@ SiteSetting.translator_enabled = true SiteSetting.experimental_content_translation = true SiteSetting.automatic_translation_backfill_rate = 1 - SiteSetting.automatic_translation_target_languages = locales.join("|") + SiteSetting.experimental_content_localization_supported_locales = locales.join("|") end it "does nothing when translator is disabled" do @@ -45,7 +45,7 @@ end it "does not translate when no target languages are configured" do - SiteSetting.automatic_translation_target_languages = "" + SiteSetting.experimental_content_localization_supported_locales = "" DiscourseTranslator::PostLocaleDetector.expects(:detect_locale).with(post).returns("en") DiscourseTranslator::PostTranslator.expects(:translate).never diff --git a/spec/jobs/detect_translate_topic_spec.rb b/spec/jobs/detect_translate_topic_spec.rb index 01255fc1..5fdf030b 100644 --- a/spec/jobs/detect_translate_topic_spec.rb +++ b/spec/jobs/detect_translate_topic_spec.rb @@ -10,7 +10,7 @@ SiteSetting.translator_enabled = true SiteSetting.experimental_content_translation = true SiteSetting.automatic_translation_backfill_rate = 1 - SiteSetting.automatic_translation_target_languages = locales.join("|") + SiteSetting.experimental_content_localization_supported_locales = locales.join("|") end it "does nothing when translator is disabled" do @@ -45,7 +45,7 @@ end it "does not translate when no target languages are configured" do - SiteSetting.automatic_translation_target_languages = "" + SiteSetting.experimental_content_localization_supported_locales = "" DiscourseTranslator::TopicLocaleDetector.expects(:detect_locale).with(topic).returns("en") DiscourseTranslator::TopicTranslator.expects(:translate).never diff --git a/spec/jobs/post_translation_backfill_spec.rb b/spec/jobs/post_translation_backfill_spec.rb index dd95a79e..e7dba829 100644 --- a/spec/jobs/post_translation_backfill_spec.rb +++ b/spec/jobs/post_translation_backfill_spec.rb @@ -3,7 +3,7 @@ describe Jobs::PostTranslationBackfill do before do SiteSetting.automatic_translation_backfill_rate = 100 - SiteSetting.automatic_translation_target_languages = "en" + SiteSetting.experimental_content_localization_supported_locales = "en" end it "does not enqueue post translation when translator disabled" do @@ -26,7 +26,7 @@ it "does not enqueue psot translation if backfill languages are not set" do SiteSetting.translator_enabled = true SiteSetting.experimental_content_translation = true - SiteSetting.automatic_translation_target_languages = "" + SiteSetting.experimental_content_localization_supported_locales = "" described_class.new.execute({}) diff --git a/spec/jobs/translate_categories_spec.rb b/spec/jobs/translate_categories_spec.rb index b83bbec0..f2891641 100644 --- a/spec/jobs/translate_categories_spec.rb +++ b/spec/jobs/translate_categories_spec.rb @@ -15,7 +15,7 @@ def localize_all_categories(*locales) SiteSetting.translator_enabled = true SiteSetting.experimental_content_translation = true SiteSetting.automatic_translation_backfill_rate = 100 - SiteSetting.automatic_translation_target_languages = "pt|zh_CN" + SiteSetting.experimental_content_localization_supported_locales = "pt|zh_CN" DiscourseTranslator::Provider.stubs(:get).returns(translator) Jobs.run_immediately! @@ -38,7 +38,7 @@ def localize_all_categories(*locales) end it "does nothing when no target languages are configured" do - SiteSetting.automatic_translation_target_languages = "" + SiteSetting.experimental_content_localization_supported_locales = "" translator.expects(:translate_text!).never diff --git a/spec/jobs/translate_posts_spec.rb b/spec/jobs/translate_posts_spec.rb index a44ba350..3c542475 100644 --- a/spec/jobs/translate_posts_spec.rb +++ b/spec/jobs/translate_posts_spec.rb @@ -10,7 +10,7 @@ SiteSetting.translator_enabled = true SiteSetting.experimental_content_translation = true SiteSetting.automatic_translation_backfill_rate = 1 - SiteSetting.automatic_translation_target_languages = locales.join("|") + SiteSetting.experimental_content_localization_supported_locales = locales.join("|") end it "does nothing when translator is disabled" do @@ -28,7 +28,7 @@ end it "does nothing when no target languages are configured" do - SiteSetting.automatic_translation_target_languages = "" + SiteSetting.experimental_content_localization_supported_locales = "" DiscourseTranslator::PostTranslator.expects(:translate).never job.execute({}) diff --git a/spec/jobs/translate_topics_spec.rb b/spec/jobs/translate_topics_spec.rb index 7135a909..d8b3ca0a 100644 --- a/spec/jobs/translate_topics_spec.rb +++ b/spec/jobs/translate_topics_spec.rb @@ -10,7 +10,7 @@ SiteSetting.translator_enabled = true SiteSetting.experimental_content_translation = true SiteSetting.automatic_translation_backfill_rate = 1 - SiteSetting.automatic_translation_target_languages = locales.join("|") + SiteSetting.experimental_content_localization_supported_locales = locales.join("|") end it "does nothing when translator is disabled" do @@ -28,7 +28,7 @@ end it "does nothing when no target languages are configured" do - SiteSetting.automatic_translation_target_languages = "" + SiteSetting.experimental_content_localization_supported_locales = "" DiscourseTranslator::TopicTranslator.expects(:translate).never job.execute({}) diff --git a/spec/system/anon_language_switcher_spec.rb b/spec/system/anon_language_switcher_spec.rb deleted file mode 100644 index 8844b4d3..00000000 --- a/spec/system/anon_language_switcher_spec.rb +++ /dev/null @@ -1,40 +0,0 @@ -# frozen_string_literal: true - -RSpec.describe "Anonymous user language switcher", type: :system do - SWITCHER_SELECTOR = "button[data-identifier='discourse-translator_language-switcher']" - - let(:topic_page) { PageObjects::Pages::Topic.new } - let(:switcher) { PageObjects::Components::DMenu.new(SWITCHER_SELECTOR) } - - fab!(:japanese_user) { Fabricate(:user, locale: "ja") } - fab!(:topic) do - topic = Fabricate(:topic, title: "Life strategies from The Art of War") - Fabricate(:post, topic:) - topic - end - - before do - SiteSetting.translator_enabled = true - SiteSetting.allow_user_locale = true - SiteSetting.set_locale_from_cookie = true - SiteSetting.automatic_translation_backfill_rate = 1 - end - - it "only shows the language switcher based on what is in target languages" do - SiteSetting.automatic_translation_target_languages = "es|ja" - SiteSetting.experimental_anon_language_switcher = true - visit("/") - - expect(page).to have_css(SWITCHER_SELECTOR) - - switcher.expand - expect(switcher).to have_content("日本語") - expect(switcher).to have_content("Español") - - SiteSetting.automatic_translation_target_languages = "es" - visit("/") - - switcher.expand - expect(switcher).not_to have_content("日本語") - end -end diff --git a/spec/system/site_settings_validation_spec.rb b/spec/system/site_settings_validation_spec.rb deleted file mode 100644 index 36322060..00000000 --- a/spec/system/site_settings_validation_spec.rb +++ /dev/null @@ -1,27 +0,0 @@ -# frozen_string_literal: true - -RSpec.describe "Translation settings", type: :system do - fab!(:admin) - - before do - sign_in(admin) - SiteSetting.translator_enabled = true - end - - it "warns when automatic_translation_target_languages is being set but backfill limit is 0" do - visit( - "/admin/plugins/discourse-translator/settings?filter=automatic%20translation%20target%20languages", - ) - - setting = - PageObjects::Components::SelectKit.new( - "[data-setting='automatic_translation_target_languages'] .select-kit", - ) - setting.expand - setting.select_row_by_value("ja") - - page.find(".setting-controls button.ok").click() - - expect(page).to have_content(I18n.t("site_settings.errors.needs_nonzero_backfill")) - end -end