Skip to content

Commit 4a2faf9

Browse files
authored
DEV: Use backend plugin api instead of frontend apis to override translation values (#210)
In #205, we returned translated values using existing JS apis. While this was convenient, it does not allow us to modify crawler views such as ... https://github.com/discourse/discourse/blob/main/app/views/topics/show.html.erb ... when we want to serve translated pages. This commit makes use of discourse/discourse#31261 to override the values.
1 parent 7d411e4 commit 4a2faf9

File tree

6 files changed

+120
-43
lines changed

6 files changed

+120
-43
lines changed

.discourse-compatibility

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
< 3.5.0.beta1-dev: f7d6ca6b32c0cff27422dd9f7583f41b203c0c57
1+
< 3.5.0.beta1-dev: 65d7ea2dbc9e7bf276e5ac3f9e23c2111e64e278
22
< 3.4.0.beta3-dev: b4cf3a065884816fa3f770248c2bf908ba65d8ac
33
< 3.4.0.beta1-dev: 5346b4bafba2c2fb817f030a473b7bbca97b909c
44
< 3.3.0.beta1-dev: 6750e10a6d9dfd3fc2c9a0cac5a83aca1a8ee401

assets/javascripts/discourse/initializers/extend-for-translate-button.js

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -29,25 +29,6 @@ function initializeTranslation(api) {
2929
(currentUser || siteSettings.experimental_anon_language_switcher)
3030
) {
3131
api.renderInOutlet("topic-navigation", ShowOriginalContent);
32-
api.decorateCookedElement((cookedElement, helper) => {
33-
if (helper) {
34-
const translatedCooked = helper.getModel().get("translated_cooked");
35-
if (translatedCooked) {
36-
cookedElement.innerHTML = translatedCooked;
37-
} else {
38-
// this experimental feature does not yet support
39-
// translating individual untranslated posts
40-
}
41-
}
42-
});
43-
44-
api.registerModelTransformer("topic", (topics) => {
45-
topics.forEach((topic) => {
46-
if (topic.translated_title) {
47-
topic.set("fancy_title", topic.translated_title);
48-
}
49-
});
50-
});
5132
}
5233

5334
if (!siteSettings.experimental_topic_translation) {

plugin.rb

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -60,17 +60,33 @@ module ::DiscourseTranslator
6060
scope.can_translate?(object)
6161
end
6262

63-
add_to_serializer :post, :translated_cooked do
64-
if !SiteSetting.experimental_topic_translation || scope.request.params["show"] == "original"
65-
return nil
63+
register_modifier(:basic_post_serializer_cooked) do |cooked, serializer|
64+
if !SiteSetting.experimental_topic_translation ||
65+
serializer.scope.request.params["show"] == "original" ||
66+
serializer.object.detected_locale == I18n.locale.to_s.gsub("_", "-")
67+
cooked
68+
else
69+
serializer.object.translation_for(I18n.locale).presence
6670
end
67-
object.translation_for(I18n.locale) || nil
6871
end
6972

70-
add_to_serializer :topic_view, :translated_title do
71-
if !SiteSetting.experimental_topic_translation || scope.request.params["show"] == "original"
72-
return nil
73+
register_modifier(:topic_serializer_fancy_title) do |fancy_title, serializer|
74+
if !SiteSetting.experimental_topic_translation ||
75+
serializer.scope.request.params["show"] == "original" ||
76+
serializer.object.detected_locale == I18n.locale.to_s.gsub("_", "-")
77+
fancy_title
78+
else
79+
serializer.object.translation_for(I18n.locale).presence
80+
end
81+
end
82+
83+
register_modifier(:topic_view_serializer_fancy_title) do |fancy_title, serializer|
84+
if !SiteSetting.experimental_topic_translation ||
85+
serializer.scope.request.params["show"] == "original" ||
86+
serializer.object.topic.detected_locale == I18n.locale.to_s.gsub("_", "-")
87+
fancy_title
88+
else
89+
serializer.object.topic.translation_for(I18n.locale).presence
7390
end
74-
object.topic.translation_for(I18n.locale) || nil
7591
end
7692
end
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# frozen_string_literal: true
2+
3+
require "rails_helper"
4+
5+
describe BasicTopicSerializer do
6+
fab!(:user) { Fabricate(:user, locale: "ja") }
7+
fab!(:topic)
8+
9+
before do
10+
SiteSetting.translator_enabled = true
11+
SiteSetting.experimental_topic_translation = true
12+
end
13+
14+
describe "#fancy_title" do
15+
let!(:guardian) { Guardian.new(user) }
16+
let!(:original_title) { "FUS ROH DAAHHH" }
17+
let!(:jap_title) { "フス・ロ・ダ・ア" }
18+
19+
before do
20+
topic.title = original_title
21+
SiteSetting.experimental_topic_translation = true
22+
I18n.locale = "ja"
23+
end
24+
25+
def serialize_topic(guardian_user: user, params: {})
26+
env = { "action_dispatch.request.parameters" => params, "REQUEST_METHOD" => "GET" }
27+
request = ActionDispatch::Request.new(env)
28+
guardian = Guardian.new(guardian_user, request)
29+
BasicTopicSerializer.new(topic, scope: guardian)
30+
end
31+
32+
it "does not replace fancy_title with translation when experimental_topic_translation is disabled" do
33+
SiteSetting.experimental_topic_translation = false
34+
topic.set_translation("ja", jap_title)
35+
36+
expect(serialize_topic.fancy_title).to eq(topic.fancy_title)
37+
end
38+
39+
it "does not replace fancy_title with translation when show_original param is present" do
40+
topic.set_translation("ja", jap_title)
41+
expect(serialize_topic(params: { "show" => "original" }).fancy_title).to eq(topic.fancy_title)
42+
end
43+
44+
it "does not replace fancy_title with translation when no translation exists" do
45+
expect(serialize_topic.fancy_title).to eq(topic.fancy_title)
46+
end
47+
48+
it "does not replace fancy_title when topic is already in correct locale" do
49+
I18n.locale = "ja"
50+
topic.set_detected_locale("ja")
51+
topic.set_translation("ja", jap_title)
52+
53+
expect(serialize_topic.fancy_title).to eq(topic.fancy_title)
54+
end
55+
56+
it "returns translated title in fancy_title when translation exists for current locale" do
57+
topic.set_translation("ja", jap_title)
58+
expect(serialize_topic.fancy_title).to eq(jap_title)
59+
end
60+
end
61+
end

spec/serializers/post_serializer_spec.rb

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -88,31 +88,42 @@ def serialize_post(guardian_user: user, params: {})
8888
PostSerializer.new(post, scope: guardian)
8989
end
9090

91-
before { SiteSetting.experimental_topic_translation = true }
91+
before do
92+
SiteSetting.translator_enabled = true
93+
SiteSetting.experimental_topic_translation = true
94+
end
9295

9396
it "does not return translated_cooked when experimental_topic_translation is disabled" do
9497
SiteSetting.experimental_topic_translation = false
95-
expect(serialize_post.translated_cooked).to eq(nil)
98+
expect(serialize_post.cooked).to eq(post.cooked)
9699
end
97100

98101
it "does not return translated_cooked when show=original param is present" do
99102
I18n.locale = "ja"
100103
post.set_translation("ja", "こんにちは")
101104

102-
expect(serialize_post(params: { "show" => "original" }).translated_cooked).to eq(nil)
103-
expect(serialize_post(params: { "show" => "derp" }).translated_cooked).to eq("こんにちは")
105+
expect(serialize_post(params: { "show" => "original" }).cooked).to eq(post.cooked)
106+
expect(serialize_post(params: { "show" => "derp" }).cooked).to eq("こんにちは")
107+
end
108+
109+
it "does not return translated_cooked when post is already in correct locale" do
110+
I18n.locale = "ja"
111+
post.set_detected_locale("ja")
112+
post.set_translation("ja", "こんにちは")
113+
114+
expect(serialize_post.cooked).to eq(post.cooked)
104115
end
105116

106117
it "returns translated content based on locale" do
107118
I18n.locale = "ja"
108119
post.set_translation("ja", "こんにちは")
109120
post.set_translation("es", "Hola")
110-
expect(serialize_post.translated_cooked).to eq("こんにちは")
121+
expect(serialize_post.cooked).to eq("こんにちは")
111122
end
112123

113124
it "does not return translated_cooked when plugin is disabled" do
114125
SiteSetting.translator_enabled = false
115-
expect(serialize_post.translated_cooked).to eq(nil)
126+
expect(serialize_post.cooked).to eq(post.cooked)
116127
end
117128
end
118129
end

spec/serializers/topic_view_serializer_spec.rb

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
expect(topic_view.posts.first.association(:content_locale)).to be_loaded
3232
end
3333

34-
describe "#translated_title" do
34+
describe "#fancy_title" do
3535
fab!(:user) { Fabricate(:user, locale: "ja") }
3636
fab!(:topic)
3737

@@ -52,25 +52,33 @@ def serialize_topic(guardian_user: user, params: {})
5252
TopicViewSerializer.new(TopicView.new(topic), scope: guardian)
5353
end
5454

55-
it "does not return translated_title when experimental_topic_translation is disabled" do
55+
it "does not replace fancy_title with translation when experimental_topic_translation is disabled" do
5656
SiteSetting.experimental_topic_translation = false
5757
topic.set_translation("ja", jap_title)
5858

59-
expect(serialize_topic.translated_title).to eq(nil)
59+
expect(serialize_topic.fancy_title).to eq(topic.fancy_title)
6060
end
6161

62-
it "does not return translated_title when show_original param is present" do
62+
it "does not replace fancy_title with translation when show_original param is present" do
6363
topic.set_translation("ja", jap_title)
64-
expect(serialize_topic(params: { "show" => "original" }).translated_title).to eq(nil)
64+
expect(serialize_topic(params: { "show" => "original" }).fancy_title).to eq(topic.fancy_title)
6565
end
6666

67-
it "does not return translated_title when no translation exists" do
68-
expect(serialize_topic.translated_title).to eq(nil)
67+
it "does not replace fancy_title with translation when no translation exists" do
68+
expect(serialize_topic.fancy_title).to eq(topic.fancy_title)
6969
end
7070

71-
it "returns translated title when translation exists for current locale" do
71+
it "does not replace fancy_title when topic is already in correct locale" do
72+
I18n.locale = "ja"
73+
topic.set_detected_locale("ja")
74+
topic.set_translation("ja", jap_title)
75+
76+
expect(serialize_topic.fancy_title).to eq(topic.fancy_title)
77+
end
78+
79+
it "returns translated title in fancy_title when translation exists for current locale" do
7280
topic.set_translation("ja", jap_title)
73-
expect(serialize_topic.translated_title).to eq(jap_title)
81+
expect(serialize_topic.fancy_title).to eq(jap_title)
7482
end
7583
end
7684
end

0 commit comments

Comments
 (0)