Skip to content

Commit 3f03260

Browse files
committed
Cleanup editor translation related methods
- Unify logic for loading editor/property/doc/extractable translations. - Replace legacy `TranslationServer` methods with translation domains for internal translations. - Only pre-create editor/property/doc translation domains in editor builds. - Prevent adding `null` translation. - Fixes potential loading of duplicated editor translations. - Add internal `has_translation_for_locale()` instead of calling `get_loaded_translations().has()`.
1 parent 8b4b93a commit 3f03260

File tree

12 files changed

+77
-163
lines changed

12 files changed

+77
-163
lines changed

core/string/translation_domain.cpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,6 @@ StringName TranslationDomain::get_message_from_translations(const String &p_loca
202202
int best_score = 0;
203203

204204
for (const Ref<Translation> &E : translations) {
205-
ERR_CONTINUE(E.is_null());
206205
int score = TranslationServer::get_singleton()->compare_locales(p_locale, E->get_locale());
207206
if (score > 0 && score >= best_score) {
208207
const StringName r = E->get_message(p_message, p_context);
@@ -225,7 +224,6 @@ StringName TranslationDomain::get_message_from_translations(const String &p_loca
225224
int best_score = 0;
226225

227226
for (const Ref<Translation> &E : translations) {
228-
ERR_CONTINUE(E.is_null());
229227
int score = TranslationServer::get_singleton()->compare_locales(p_locale, E->get_locale());
230228
if (score > 0 && score >= best_score) {
231229
const StringName r = E->get_plural_message(p_message, p_message_plural, p_n, p_context);
@@ -246,7 +244,6 @@ StringName TranslationDomain::get_message_from_translations(const String &p_loca
246244
PackedStringArray TranslationDomain::get_loaded_locales() const {
247245
PackedStringArray locales;
248246
for (const Ref<Translation> &E : translations) {
249-
ERR_CONTINUE(E.is_null());
250247
const String &locale = E->get_locale();
251248
if (!locales.has(locale)) {
252249
locales.push_back(locale);
@@ -255,13 +252,20 @@ PackedStringArray TranslationDomain::get_loaded_locales() const {
255252
return locales;
256253
}
257254

255+
bool TranslationDomain::has_translation_for_locale(const String &p_locale) const {
256+
for (const Ref<Translation> &E : translations) {
257+
if (E->get_locale() == p_locale) {
258+
return true;
259+
}
260+
}
261+
return false;
262+
}
263+
258264
// Translation objects that could potentially be used for the given locale.
259265
HashSet<Ref<Translation>> TranslationDomain::get_potential_translations(const String &p_locale) const {
260266
HashSet<Ref<Translation>> res;
261267

262268
for (const Ref<Translation> &E : translations) {
263-
ERR_CONTINUE(E.is_null());
264-
265269
if (TranslationServer::get_singleton()->compare_locales(p_locale, E->get_locale()) > 0) {
266270
res.insert(E);
267271
}
@@ -274,8 +278,6 @@ Ref<Translation> TranslationDomain::get_translation_object(const String &p_local
274278
int best_score = 0;
275279

276280
for (const Ref<Translation> &E : translations) {
277-
ERR_CONTINUE(E.is_null());
278-
279281
int score = TranslationServer::get_singleton()->compare_locales(p_locale, E->get_locale());
280282
if (score > 0 && score >= best_score) {
281283
res = E;
@@ -289,6 +291,7 @@ Ref<Translation> TranslationDomain::get_translation_object(const String &p_local
289291
}
290292

291293
void TranslationDomain::add_translation(const Ref<Translation> &p_translation) {
294+
ERR_FAIL_COND_MSG(p_translation.is_null(), "Invalid translation provided.");
292295
translations.insert(p_translation);
293296
}
294297

core/string/translation_domain.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ class TranslationDomain : public RefCounted {
7171
StringName get_message_from_translations(const String &p_locale, const StringName &p_message, const StringName &p_context) const;
7272
StringName get_message_from_translations(const String &p_locale, const StringName &p_message, const StringName &p_message_plural, int p_n, const StringName &p_context) const;
7373
PackedStringArray get_loaded_locales() const;
74+
bool has_translation_for_locale(const String &p_locale) const;
7475
HashSet<Ref<Translation>> get_potential_translations(const String &p_locale) const;
7576

7677
public:

core/string/translation_server.cpp

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -470,8 +470,7 @@ void TranslationServer::setup() {
470470
String TranslationServer::get_tool_locale() {
471471
#ifdef TOOLS_ENABLED
472472
if (Engine::get_singleton()->is_editor_hint() || Engine::get_singleton()->is_project_manager_hint()) {
473-
const PackedStringArray &locales = editor_domain->get_loaded_locales();
474-
if (locales.has(locale)) {
473+
if (editor_domain->has_translation_for_locale(locale)) {
475474
return locale;
476475
}
477476
return "en";
@@ -488,26 +487,6 @@ String TranslationServer::get_tool_locale() {
488487
}
489488
}
490489

491-
StringName TranslationServer::tool_translate(const StringName &p_message, const StringName &p_context) const {
492-
return editor_domain->translate(p_message, p_context);
493-
}
494-
495-
StringName TranslationServer::tool_translate_plural(const StringName &p_message, const StringName &p_message_plural, int p_n, const StringName &p_context) const {
496-
return editor_domain->translate_plural(p_message, p_message_plural, p_n, p_context);
497-
}
498-
499-
StringName TranslationServer::property_translate(const StringName &p_message, const StringName &p_context) const {
500-
return property_domain->translate(p_message, p_context);
501-
}
502-
503-
StringName TranslationServer::doc_translate(const StringName &p_message, const StringName &p_context) const {
504-
return doc_domain->translate(p_message, p_context);
505-
}
506-
507-
StringName TranslationServer::doc_translate_plural(const StringName &p_message, const StringName &p_message_plural, int p_n, const StringName &p_context) const {
508-
return doc_domain->translate_plural(p_message, p_message_plural, p_n, p_context);
509-
}
510-
511490
bool TranslationServer::is_pseudolocalization_enabled() const {
512491
return main_domain->is_pseudolocalization_enabled();
513492
}
@@ -623,9 +602,14 @@ void TranslationServer::load_translations() {
623602

624603
TranslationServer::TranslationServer() {
625604
singleton = this;
605+
626606
main_domain.instantiate();
607+
608+
#ifdef TOOLS_ENABLED
627609
editor_domain = get_or_add_domain("godot.editor");
628610
property_domain = get_or_add_domain("godot.properties");
629611
doc_domain = get_or_add_domain("godot.documentation");
612+
#endif // TOOLS_ENABLED
613+
630614
init_locale_info();
631615
}

core/string/translation_server.h

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,11 @@ class TranslationServer : public Object {
4040
String fallback;
4141

4242
Ref<TranslationDomain> main_domain;
43+
#ifdef TOOLS_ENABLED
4344
Ref<TranslationDomain> editor_domain;
4445
Ref<TranslationDomain> property_domain;
4546
Ref<TranslationDomain> doc_domain;
47+
#endif // TOOLS_ENABLED
4648
HashMap<StringName, Ref<TranslationDomain>> custom_domains;
4749

4850
mutable HashMap<String, int> locale_compare_cache;
@@ -94,8 +96,13 @@ class TranslationServer : public Object {
9496
public:
9597
_FORCE_INLINE_ static TranslationServer *get_singleton() { return singleton; }
9698

99+
// Built-in domain accessors. For engine code only, user code should use `get_or_add_domain()` instead.
97100
Ref<TranslationDomain> get_main_domain() const { return main_domain; }
101+
#ifdef TOOLS_ENABLED
98102
Ref<TranslationDomain> get_editor_domain() const { return editor_domain; }
103+
Ref<TranslationDomain> get_property_domain() const { return property_domain; }
104+
Ref<TranslationDomain> get_doc_domain() const { return doc_domain; }
105+
#endif // TOOLS_ENABLED
99106

100107
void set_locale(const String &p_locale);
101108
String get_locale() const;
@@ -133,11 +140,6 @@ class TranslationServer : public Object {
133140
int compare_locales(const String &p_locale_a, const String &p_locale_b) const;
134141

135142
String get_tool_locale();
136-
StringName tool_translate(const StringName &p_message, const StringName &p_context = "") const;
137-
StringName tool_translate_plural(const StringName &p_message, const StringName &p_message_plural, int p_n, const StringName &p_context = "") const;
138-
StringName property_translate(const StringName &p_message, const StringName &p_context = "") const;
139-
StringName doc_translate(const StringName &p_message, const StringName &p_context = "") const;
140-
StringName doc_translate_plural(const StringName &p_message, const StringName &p_message_plural, int p_n, const StringName &p_context = "") const;
141143

142144
bool has_domain(const StringName &p_domain) const;
143145
Ref<TranslationDomain> get_or_add_domain(const StringName &p_domain);

core/string/ustring.cpp

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5944,7 +5944,7 @@ Vector<uint8_t> String::to_multibyte_char_buffer(const String &p_encoding) const
59445944
*/
59455945
String TTR(const String &p_text, const String &p_context) {
59465946
if (TranslationServer::get_singleton()) {
5947-
return TranslationServer::get_singleton()->tool_translate(p_text, p_context);
5947+
return TranslationServer::get_singleton()->get_editor_domain()->translate(p_text, p_context);
59485948
}
59495949

59505950
return p_text;
@@ -5964,7 +5964,7 @@ String TTR(const String &p_text, const String &p_context) {
59645964
*/
59655965
String TTRN(const String &p_text, const String &p_text_plural, int p_n, const String &p_context) {
59665966
if (TranslationServer::get_singleton()) {
5967-
return TranslationServer::get_singleton()->tool_translate_plural(p_text, p_text_plural, p_n, p_context);
5967+
return TranslationServer::get_singleton()->get_editor_domain()->translate_plural(p_text, p_text_plural, p_n, p_context);
59685968
}
59695969

59705970
// Return message based on English plural rule if translation is not possible.
@@ -5985,7 +5985,7 @@ String DTR(const String &p_text, const String &p_context) {
59855985
const String text = p_text.dedent().strip_edges();
59865986

59875987
if (TranslationServer::get_singleton()) {
5988-
return String(TranslationServer::get_singleton()->doc_translate(text, p_context)).replace("$DOCS_URL", GODOT_VERSION_DOCS_URL);
5988+
return String(TranslationServer::get_singleton()->get_doc_domain()->translate(text, p_context)).replace("$DOCS_URL", GODOT_VERSION_DOCS_URL);
59895989
}
59905990

59915991
return text.replace("$DOCS_URL", GODOT_VERSION_DOCS_URL);
@@ -6002,7 +6002,7 @@ String DTRN(const String &p_text, const String &p_text_plural, int p_n, const St
60026002
const String text_plural = p_text_plural.dedent().strip_edges();
60036003

60046004
if (TranslationServer::get_singleton()) {
6005-
return String(TranslationServer::get_singleton()->doc_translate_plural(text, text_plural, p_n, p_context)).replace("$DOCS_URL", GODOT_VERSION_DOCS_URL);
6005+
return String(TranslationServer::get_singleton()->get_doc_domain()->translate_plural(text, text_plural, p_n, p_context)).replace("$DOCS_URL", GODOT_VERSION_DOCS_URL);
60066006
}
60076007

60086008
// Return message based on English plural rule if translation is not possible.
@@ -6026,11 +6026,13 @@ String DTRN(const String &p_text, const String &p_text_plural, int p_n, const St
60266026
*/
60276027
String RTR(const String &p_text, const String &p_context) {
60286028
if (TranslationServer::get_singleton()) {
6029-
String rtr = TranslationServer::get_singleton()->tool_translate(p_text, p_context);
6030-
if (rtr.is_empty() || rtr == p_text) {
6031-
return TranslationServer::get_singleton()->translate(p_text, p_context);
6029+
#ifdef TOOLS_ENABLED
6030+
String rtr = TranslationServer::get_singleton()->get_editor_domain()->translate(p_text, p_context);
6031+
if (!rtr.is_empty() && rtr != p_text) {
6032+
return rtr;
60326033
}
6033-
return rtr;
6034+
#endif // TOOLS_ENABLED
6035+
return TranslationServer::get_singleton()->translate(p_text, p_context);
60346036
}
60356037

60366038
return p_text;
@@ -6049,11 +6051,13 @@ String RTR(const String &p_text, const String &p_context) {
60496051
*/
60506052
String RTRN(const String &p_text, const String &p_text_plural, int p_n, const String &p_context) {
60516053
if (TranslationServer::get_singleton()) {
6052-
String rtr = TranslationServer::get_singleton()->tool_translate_plural(p_text, p_text_plural, p_n, p_context);
6053-
if (rtr.is_empty() || rtr == p_text || rtr == p_text_plural) {
6054-
return TranslationServer::get_singleton()->translate_plural(p_text, p_text_plural, p_n, p_context);
6054+
#ifdef TOOLS_ENABLED
6055+
String rtr = TranslationServer::get_singleton()->get_editor_domain()->translate_plural(p_text, p_text_plural, p_n, p_context);
6056+
if (!rtr.is_empty() && rtr != p_text && rtr != p_text_plural) {
6057+
return rtr;
60556058
}
6056-
return rtr;
6059+
#endif // TOOLS_ENABLED
6060+
return TranslationServer::get_singleton()->translate_plural(p_text, p_text_plural, p_n, p_context);
60576061
}
60586062

60596063
// Return message based on English plural rule if translation is not possible.

editor/doc/doc_tools.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ static String _get_indent(const String &p_text) {
7171
static String _translate_doc_string(const String &p_text) {
7272
const String indent = _get_indent(p_text);
7373
const String message = p_text.dedent().strip_edges();
74-
const String translated = TranslationServer::get_singleton()->doc_translate(message, "");
74+
const String translated = TranslationServer::get_singleton()->get_doc_domain()->translate(message, StringName());
7575
// No need to restore stripped edges because they'll be stripped again later.
7676
return translated.indent(indent);
7777
}

editor/editor_builders.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ def make_translations(target, source, env):
124124
file.write(f"""\
125125
#include "{target_h}"
126126
127-
const {category.capitalize()}TranslationList _{category}_translations[] = {{
127+
const EditorTranslationList _{category}_translations[] = {{
128128
""")
129129

130130
for x in xl_names:
@@ -137,12 +137,18 @@ def make_translations(target, source, env):
137137

138138
with methods.generated_wrapper(target_h) as file:
139139
file.write(f"""\
140-
struct {category.capitalize()}TranslationList {{
140+
141+
#ifndef EDITOR_TRANSLATION_LIST
142+
#define EDITOR_TRANSLATION_LIST
143+
144+
struct EditorTranslationList {{
141145
const char* lang;
142146
int comp_size;
143147
int uncomp_size;
144148
const unsigned char* data;
145149
}};
146150
147-
extern const {category.capitalize()}TranslationList _{category}_translations[];
151+
#endif // EDITOR_TRANSLATION_LIST
152+
153+
extern const EditorTranslationList _{category}_translations[];
148154
""")

editor/editor_node.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -578,7 +578,7 @@ void EditorNode::_update_translations() {
578578
if (main->is_enabled()) {
579579
// Check for the exact locale.
580580
// `get_potential_translations("zh_CN")` could return translations for "zh".
581-
if (main->get_loaded_locales().has(main->get_locale_override())) {
581+
if (main->has_translation_for_locale(main->get_locale_override())) {
582582
// The set of translation resources for the current locale changed.
583583
const HashSet<Ref<Translation>> translations = main->get_potential_translations(main->get_locale_override());
584584
if (translations != tracked_translations) {

editor/inspector/editor_property_name_processor.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ String EditorPropertyNameProcessor::process_name(const String &p_name, Style p_s
120120
case STYLE_LOCALIZED: {
121121
const String capitalized = _capitalize_name(p_name);
122122
if (TranslationServer::get_singleton()) {
123-
return TranslationServer::get_singleton()->property_translate(capitalized, _get_context(p_name, p_property, p_class));
123+
return TranslationServer::get_singleton()->get_property_domain()->translate(capitalized, _get_context(p_name, p_property, p_class));
124124
}
125125
return capitalized;
126126
} break;
@@ -130,7 +130,7 @@ String EditorPropertyNameProcessor::process_name(const String &p_name, Style p_s
130130

131131
String EditorPropertyNameProcessor::translate_group_name(const String &p_name) const {
132132
if (TranslationServer::get_singleton()) {
133-
return TranslationServer::get_singleton()->property_translate(p_name);
133+
return TranslationServer::get_singleton()->get_property_domain()->translate(p_name, StringName());
134134
}
135135
return p_name;
136136
}

editor/settings/editor_settings.cpp

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1327,16 +1327,10 @@ void EditorSettings::setup_language() {
13271327
TranslationServer::get_singleton()->set_locale(lang);
13281328
return; // Default, nothing to do.
13291329
}
1330-
// Load editor translation for configured/detected locale.
1331-
load_editor_translations(lang);
1332-
load_property_translations(lang);
13331330

1334-
// Load class reference translation.
1331+
load_editor_translations(lang);
13351332
load_doc_translations(lang);
13361333

1337-
// Load extractable translation for projects.
1338-
load_extractable_translations(lang);
1339-
13401334
TranslationServer::get_singleton()->set_locale(lang);
13411335
}
13421336

0 commit comments

Comments
 (0)