Add methods for querying loaded Translation instances

This commit is contained in:
Haoyu Qiu
2025-11-09 16:17:04 +08:00
parent b79fe2e020
commit ec860ffe4a
9 changed files with 257 additions and 82 deletions

View File

@ -228,37 +228,37 @@ TEST_CASE("[TranslationCSV] CSV import") {
CHECK(result == OK);
CHECK(gen_files.size() == 4);
TranslationServer *ts = TranslationServer::get_singleton();
Ref<TranslationDomain> td = TranslationServer::get_singleton()->get_or_add_domain("godot.test");
for (const String &file : gen_files) {
Ref<Translation> translation = ResourceLoader::load(file);
CHECK(translation.is_valid());
ts->add_translation(translation);
td->add_translation(translation);
}
ts->set_locale("en");
td->set_locale_override("en");
// `tr` can be called on any Object, we reuse TranslationServer for convenience.
CHECK(ts->tr("GOOD_MORNING") == "Good Morning");
CHECK(ts->tr("GOOD_EVENING") == "Good Evening");
CHECK(td->translate("GOOD_MORNING", StringName()) == "Good Morning");
CHECK(td->translate("GOOD_EVENING", StringName()) == "Good Evening");
ts->set_locale("de");
td->set_locale_override("de");
CHECK(ts->tr("GOOD_MORNING") == "Guten Morgen");
CHECK(ts->tr("GOOD_EVENING") == "Good Evening"); // Left blank in CSV, should source from 'en'.
CHECK(td->translate("GOOD_MORNING", StringName()) == "Guten Morgen");
CHECK(td->translate("GOOD_EVENING", StringName()) == "Good Evening"); // Left blank in CSV, should source from 'en'.
ts->set_locale("ja");
td->set_locale_override("ja");
CHECK(ts->tr("GOOD_MORNING") == String::utf8("おはよう"));
CHECK(ts->tr("GOOD_EVENING") == String::utf8("こんばんは"));
CHECK(td->translate("GOOD_MORNING", StringName()) == String::utf8("おはよう"));
CHECK(td->translate("GOOD_EVENING", StringName()) == String::utf8("こんばんは"));
/* FIXME: This passes, but triggers a chain reaction that makes test_viewport
* and test_text_edit explode in a billion glittery Unicode particles.
ts->set_locale("fa");
td->set_locale_override("fa");
CHECK(ts->tr("GOOD_MORNING") == String::utf8("صبح بخیر"));
CHECK(ts->tr("GOOD_EVENING") == String::utf8("عصر بخیر"));
CHECK(td->translate("GOOD_MORNING", String()) == String::utf8("صبح بخیر"));
CHECK(td->translate("GOOD_EVENING", String()) == String::utf8("عصر بخیر"));
*/
TranslationServer::get_singleton()->remove_domain("godot.test");
}
#endif // TOOLS_ENABLED

View File

@ -36,39 +36,55 @@
namespace TestTranslationServer {
TEST_CASE("[TranslationServer] Translation operations") {
Ref<TranslationDomain> td = TranslationServer::get_singleton()->get_or_add_domain("godot.test");
CHECK(td->get_translations().is_empty());
Ref<Translation> t1 = memnew(Translation);
t1->set_locale("uk");
t1->set_locale("uk"); // Ukrainian.
t1->add_message("Good Morning", String(U"Добрий ранок"));
td->add_translation(t1);
CHECK(td->get_translations().size() == 1);
CHECK(td->has_translation_for_locale("uk", true));
CHECK(td->has_translation_for_locale("uk", false));
CHECK_FALSE(td->has_translation_for_locale("uk_UA", true));
CHECK(td->has_translation_for_locale("uk_UA", false));
CHECK(td->find_translations("uk", false).size() == 1);
CHECK(td->find_translations("uk", true).size() == 1);
CHECK(td->find_translations("uk_UA", false).size() == 1);
CHECK(td->find_translations("uk_UA", true).size() == 0);
Ref<Translation> t2 = memnew(Translation);
t2->set_locale("uk");
t2->add_message("Hello Godot", String(U"你好戈多"));
t2->set_locale("uk_UA"); // Ukrainian in Ukraine.
t2->add_message("Hello Godot", String(U"Привіт, Годо."));
td->add_translation(t2);
CHECK(td->get_translations().size() == 2);
CHECK(td->has_translation_for_locale("uk", true));
CHECK(td->has_translation_for_locale("uk", false));
CHECK(td->has_translation_for_locale("uk_UA", true));
CHECK(td->has_translation_for_locale("uk_UA", false));
CHECK(td->find_translations("uk", false).size() == 2);
CHECK(td->find_translations("uk", true).size() == 1);
CHECK(td->find_translations("uk_UA", false).size() == 2);
CHECK(td->find_translations("uk_UA", true).size() == 1);
TranslationServer *ts = TranslationServer::get_singleton();
td->set_locale_override("uk");
CHECK(td->translate("Good Morning", StringName()) == String::utf8("Добрий ранок"));
// Adds translation for UK locale for the first time.
int l_count_before = ts->get_loaded_locales().size();
ts->add_translation(t1);
int l_count_after = ts->get_loaded_locales().size();
CHECK(l_count_after > l_count_before);
td->remove_translation(t1);
CHECK(td->get_translations().size() == 1);
CHECK_FALSE(td->has_translation_for_locale("uk", true));
CHECK(td->has_translation_for_locale("uk", false));
CHECK(td->has_translation_for_locale("uk_UA", true));
CHECK(td->has_translation_for_locale("uk_UA", false));
CHECK(td->find_translations("uk", true).size() == 0);
CHECK(td->find_translations("uk", false).size() == 1);
CHECK(td->find_translations("uk_UA", true).size() == 1);
CHECK(td->find_translations("uk_UA", false).size() == 1);
// Adds translation for UK locale again.
ts->add_translation(t2);
CHECK_EQ(ts->get_loaded_locales().size(), l_count_after);
// Removing that translation.
ts->remove_translation(t2);
CHECK_EQ(ts->get_loaded_locales().size(), l_count_after);
CHECK(ts->get_translation_object("uk").is_valid());
ts->set_locale("uk");
CHECK(ts->translate("Good Morning") == String::utf8("Добрий ранок"));
ts->remove_translation(t1);
CHECK(ts->get_translation_object("uk").is_null());
// If no suitable Translation object has been found - the original message should be returned.
CHECK(ts->translate("Good Morning") == "Good Morning");
CHECK(td->translate("Good Morning", StringName()) == "Good Morning");
TranslationServer::get_singleton()->remove_domain("godot.test");
}
TEST_CASE("[TranslationServer] Locale operations") {