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
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,7 @@ const SHOW_ORIGINAL_COOKIE_EXPIRY = 30;

export default class ShowOriginalContent extends Component {
static shouldRender(args) {
return (
args.topic.is_translated ||
args.topic.postStream.posts.some(({ is_translated }) => is_translated)
);
return args.topic.show_translation_toggle;
}

@service router;
Expand Down
46 changes: 28 additions & 18 deletions lib/discourse_translator/inline_translation.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,41 +22,35 @@ def inject(plugin)
# this prevents the need to load translations.

plugin.register_modifier(:basic_post_serializer_cooked) do |cooked, serializer|
if !SiteSetting.experimental_inline_translation ||
serializer.object.locale_matches?(InlineTranslation.effective_locale) ||
serializer.scope&.request&.cookies&.key?(SHOW_ORIGINAL_COOKIE)
cooked
else
if show_translation?(serializer.object, serializer.scope)
serializer.object.translation_for(InlineTranslation.effective_locale).presence
else
cooked
end
end

plugin.register_modifier(:topic_serializer_fancy_title) do |fancy_title, serializer|
if !SiteSetting.experimental_inline_translation ||
serializer.object.locale_matches?(InlineTranslation.effective_locale) ||
serializer.scope&.request&.cookies&.key?(SHOW_ORIGINAL_COOKIE)
fancy_title
else
if show_translation?(serializer.object, serializer.scope)
serializer
.object
.translation_for(InlineTranslation.effective_locale)
.presence
&.then { |t| Topic.fancy_title(t) }
else
fancy_title
end
end

plugin.register_modifier(:topic_view_serializer_fancy_title) do |fancy_title, serializer|
if !SiteSetting.experimental_inline_translation ||
serializer.object.topic.locale_matches?(InlineTranslation.effective_locale) ||
serializer.scope&.request&.cookies&.key?(SHOW_ORIGINAL_COOKIE)
fancy_title
else
if show_translation?(serializer.object.topic, serializer.scope)
serializer
.object
.topic
.translation_for(InlineTranslation.effective_locale)
.presence
&.then { |t| Topic.fancy_title(t) }
else
fancy_title
end
end

Expand All @@ -73,10 +67,20 @@ def inject(plugin)
end
end

plugin.add_to_serializer(:topic_view, :is_translated) do
SiteSetting.experimental_inline_translation &&
plugin.add_to_serializer(:topic_view, :show_translation_toggle) do
return false if !SiteSetting.experimental_inline_translation
# either the topic or any of the posts has a translation
# also, check the locale first as it is cheaper than loading translation
(
!object.topic.locale_matches?(InlineTranslation.effective_locale) &&
object.topic.translation_for(InlineTranslation.effective_locale).present?
object.topic.translation_for(InlineTranslation.effective_locale).present?
) ||
(
object.posts.any? do |post|
!post.locale_matches?(InlineTranslation.effective_locale) &&
post.translation_for(InlineTranslation.effective_locale).present?
end
)
end

plugin.register_topic_preloader_associations(:content_locale) do
Expand All @@ -86,5 +90,11 @@ def inject(plugin)
SiteSetting.translator_enabled && SiteSetting.experimental_inline_translation
end
end

def show_translation?(translatable, scope)
SiteSetting.experimental_inline_translation &&
!translatable.locale_matches?(InlineTranslation.effective_locale) &&
!scope&.request&.cookies&.key?(SHOW_ORIGINAL_COOKIE)
end
end
end
27 changes: 16 additions & 11 deletions spec/serializers/topic_view_serializer_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -122,11 +122,11 @@
before do
topic.title = original_title
SiteSetting.experimental_inline_translation = true
I18n.locale = "ja"
I18n.locale = "en"
end

def serialize_topic(guardian_user: user, params: {})
env = { "action_dispatch.request.parameters" => params, "REQUEST_METHOD" => "GET" }
def serialize_topic(guardian_user: user, cookie: "")
env = create_request_env.merge("HTTP_COOKIE" => cookie)
request = ActionDispatch::Request.new(env)
guardian = Guardian.new(guardian_user, request)
TopicViewSerializer.new(TopicView.new(topic), scope: guardian)
Expand All @@ -141,9 +141,11 @@ def serialize_topic(guardian_user: user, params: {})

it "does not replace fancy_title with translation when show_original param is present" do
topic.set_translation("ja", jap_title)
expect(serialize_topic(params: { "show" => "original" }).fancy_title).to eq(
topic.fancy_title,
)
expect(
serialize_topic(
cookie: DiscourseTranslator::InlineTranslation::SHOW_ORIGINAL_COOKIE,
).fancy_title,
).to eq(topic.fancy_title)
end

it "does not replace fancy_title with translation when no translation exists" do
Expand All @@ -159,15 +161,18 @@ def serialize_topic(guardian_user: user, params: {})
end

it "returns translated title in fancy_title when translation exists for current locale" do
I18n.locale = "ja"
SiteSetting.automatic_translation_backfill_rate = 1
SiteSetting.automatic_translation_target_languages = "ja"
topic.set_translation("ja", jap_title)
expect(serialize_topic.fancy_title).to eq("<h1>フス・ロ・ダ・ア</h1>")
end
end

describe "#is_translated" do
describe "#show_translation_toggle" do
fab!(:user)
fab!(:post_1) { Fabricate(:post, topic:) }
fab!(:post_2) { Fabricate(:post, topic:) }

before do
SiteSetting.automatic_translation_backfill_rate = 1
Expand All @@ -184,15 +189,15 @@ def serialize_topic(guardian_user: user)

SiteSetting.translator_enabled = false
SiteSetting.experimental_inline_translation = false
expect(serialize_topic.is_translated).to eq(false)
expect(serialize_topic.show_translation_toggle).to eq(false)

SiteSetting.translator_enabled = true
SiteSetting.experimental_inline_translation = false
expect(serialize_topic.is_translated).to eq(false)
expect(serialize_topic.show_translation_toggle).to eq(false)

SiteSetting.translator_enabled = true
SiteSetting.experimental_inline_translation = true
expect(serialize_topic.is_translated).to eq(true)
expect(serialize_topic.show_translation_toggle).to eq(true)
end

it "returns true when there is translation for the topic" do
Expand All @@ -201,7 +206,7 @@ def serialize_topic(guardian_user: user)
I18n.locale = "ja"
topic.set_translation("ja", "こんにちは")

expect(serialize_topic.is_translated).to eq(true)
expect(serialize_topic.show_translation_toggle).to eq(true)
end
end
end
Expand Down
Loading