Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 0 additions & 17 deletions app/validators/language_switcher_setting_validator.rb

This file was deleted.

6 changes: 3 additions & 3 deletions config/settings.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@ discourse_translator:
- Amazon
- Yandex
- LibreTranslate
validator: "DiscourseTranslator::TranslatorSelectionValidator"
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::TranslatableLanguagesValidator"
validator: "DiscourseTranslator::Validators::TranslatableLanguagesValidator"
automatic_translation_backfill_maximum_translations_per_hour:
default: 0
client: false
Expand Down Expand Up @@ -117,7 +117,7 @@ discourse_translator:
experimental_anon_language_switcher:
default: false
client: true
validator: "LanguageSwitcherSettingValidator"
validator: "DiscourseTranslator::Validators::LanguageSwitcherSettingValidator"
experimental_inline_translation:
default: false
client: true
Expand Down
45 changes: 45 additions & 0 deletions lib/discourse_translator/extensions/guardian_extension.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# frozen_string_literal: true
module DiscourseTranslator
module Extensions
module GuardianExtension
POST_DETECTION_BUFFER = 10.seconds

def user_group_allow_translate?
return false if !current_user
current_user.in_any_groups?(SiteSetting.restrict_translation_by_group_map)
end

def poster_group_allow_translate?(post)
return false if !current_user
return true if SiteSetting.restrict_translation_by_poster_group_map.empty?
return false if post.user.nil?
post.user.in_any_groups?(SiteSetting.restrict_translation_by_poster_group_map)
end

def can_detect_language?(post)
(
SiteSetting.restrict_translation_by_poster_group_map.empty? ||
post&.user&.in_any_groups?(SiteSetting.restrict_translation_by_poster_group_map)
) && post.raw.present? && post.post_type != Post.types[:small_action]
end

def can_translate?(post)
return false if post.user&.bot?
return false if !user_group_allow_translate?

# we want to return false if the post is created within a short buffer ago,
# this prevents the 🌐from appearing and then disappearing if the lang is same as user's lang
return false if post.created_at > POST_DETECTION_BUFFER.ago && post.detected_locale.blank?

if SiteSetting.experimental_inline_translation
locale = DiscourseTranslator::InlineTranslation.effective_locale
return false if post.locale_matches?(locale)
post.translation_for(locale).nil?
else
return false if post.locale_matches?(I18n.locale)
poster_group_allow_translate?(post)
end
end
end
end
end
11 changes: 11 additions & 0 deletions lib/discourse_translator/extensions/post_extension.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# frozen_string_literal: true

module DiscourseTranslator
module Extensions
module PostExtension
extend ActiveSupport::Concern
prepended { before_update :clear_translations, if: :raw_changed? }
include Translatable
end
end
end
11 changes: 11 additions & 0 deletions lib/discourse_translator/extensions/topic_extension.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# frozen_string_literal: true

module DiscourseTranslator
module Extensions
module TopicExtension
extend ActiveSupport::Concern
prepended { before_update :clear_translations, if: :title_changed? }
include Translatable
end
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# frozen_string_literal: true

module DiscourseTranslator
module Extensions
module TopicViewSerializerExtension
def posts
if SiteSetting.translator_enabled?
posts_query = object.posts.includes(:content_locale)
# this is kind of a micro-optimization.
# we do not want to eager load translations if the user is using the site's language.
# we will only load them if the user is using a different language that is supported by the site.
if SiteSetting.experimental_inline_translation &&
!LocaleMatcher.user_locale_is_default? &&
LocaleMatcher.user_locale_in_target_languages?
locale = InlineTranslation.effective_locale.to_s.gsub("_", "-")
posts_query =
posts_query
.includes(:translations)
.references(:translations)
.where(translations: { locale: [nil, locale] })
end
object.instance_variable_set(:@posts, posts_query)
end
super
end
end
end
end
41 changes: 0 additions & 41 deletions lib/discourse_translator/guardian_extension.rb

This file was deleted.

9 changes: 0 additions & 9 deletions lib/discourse_translator/post_extension.rb

This file was deleted.

9 changes: 0 additions & 9 deletions lib/discourse_translator/topic_extension.rb

This file was deleted.

25 changes: 0 additions & 25 deletions lib/discourse_translator/topic_view_serializer_extension.rb

This file was deleted.

19 changes: 0 additions & 19 deletions lib/discourse_translator/translatable_languages_validator.rb

This file was deleted.

28 changes: 0 additions & 28 deletions lib/discourse_translator/translator_selection_validator.rb

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# 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
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# 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_maximum_translations_per_hour > 0
end

def error_message
I18n.t("site_settings.errors.needs_nonzero_backfill")
end
end
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# frozen_string_literal: true

module DiscourseTranslator
module Validators
class TranslatorSelectionValidator
def initialize(opts = {})
@opts = opts
end

def valid_value?(val)
return true if val.blank?

if val == "DiscourseAi"
return false if !defined?(::DiscourseAi)
return false if !SiteSetting.ai_helper_enabled
end

true
end

def error_message
return I18n.t("translator.discourse_ai.not_installed") if !defined?(::DiscourseAi)

if !SiteSetting.ai_helper_enabled
I18n.t("translator.discourse_ai.ai_helper_required", { base_url: Discourse.base_url })
end
end
end
end
end
8 changes: 4 additions & 4 deletions plugin.rb
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,10 @@ module ::DiscourseTranslator
register_problem_check ProblemCheck::TranslatorError

reloadable_patch do
Guardian.prepend(DiscourseTranslator::GuardianExtension)
Post.prepend(DiscourseTranslator::PostExtension)
Topic.prepend(DiscourseTranslator::TopicExtension)
TopicViewSerializer.prepend(DiscourseTranslator::TopicViewSerializerExtension)
Guardian.prepend(DiscourseTranslator::Extensions::GuardianExtension)
Post.prepend(DiscourseTranslator::Extensions::PostExtension)
Topic.prepend(DiscourseTranslator::Extensions::TopicExtension)
TopicViewSerializer.prepend(DiscourseTranslator::Extensions::TopicViewSerializerExtension)
end

add_to_serializer :post, :can_translate do
Expand Down
2 changes: 1 addition & 1 deletion spec/lib/guardian_extension_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

require "rails_helper"

describe DiscourseTranslator::GuardianExtension do
describe DiscourseTranslator::Extensions::GuardianExtension do
describe "anon user" do
let!(:guardian) { Guardian.new }
fab!(:post)
Expand Down
2 changes: 1 addition & 1 deletion spec/lib/translator_selection_validator_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

require "rails_helper"

describe ::DiscourseTranslator::TranslatorSelectionValidator do
describe ::DiscourseTranslator::Validators::TranslatorSelectionValidator do
fab!(:llm_model)

describe "#valid_value?" do
Expand Down
Loading