From 53ed33039feca8fd19ae3f3d6ade04911454beac Mon Sep 17 00:00:00 2001 From: Misa Date: Fri, 2 Feb 2024 15:58:46 -0800 Subject: [PATCH] Translate level title and creator on-the-fly These weren't getting updated when cycling language with CTRL+F8. This is because they would be already baked. Luckily, at least the bool keeping track of whether or not to translate them in the first place already exists, so we can just rely on that. --- desktop_version/src/CustomLevels.cpp | 26 +++++++--------------- desktop_version/src/CustomLevels.h | 4 ++-- desktop_version/src/Editor.cpp | 32 +++++++++++++++++++++------- desktop_version/src/Game.cpp | 7 +++++- desktop_version/src/Render.cpp | 14 ++++++++++-- 5 files changed, 52 insertions(+), 31 deletions(-) diff --git a/desktop_version/src/CustomLevels.cpp b/desktop_version/src/CustomLevels.cpp index 7d882e1d..2a7494cf 100644 --- a/desktop_version/src/CustomLevels.cpp +++ b/desktop_version/src/CustomLevels.cpp @@ -87,26 +87,14 @@ static bool compare_nocase (std::string first, std::string second) * as being translated, while they're actually stored in English in the level file. * This way we translate "Untitled Level" and "Unknown" without * spreading around translations in level files posted online! */ -std::string translate_title(const std::string& title, bool* is_gettext) +bool translate_title(const std::string& title) { - if (title == "Untitled Level") - { - *is_gettext = true; - return loc::gettext("Untitled Level"); - } - *is_gettext = false; - return title; + return title == "Untitled Level"; } -std::string translate_creator(const std::string& creator, bool* is_gettext) +bool translate_creator(const std::string& creator) { - if (creator == "Unknown") - { - *is_gettext = true; - return loc::gettext("Unknown"); - } - *is_gettext = false; - return creator; + return creator == "Unknown"; } static void levelZipCallback(const char* filename) @@ -306,8 +294,10 @@ bool customlevelclass::getLevelMetaDataAndPlaytestArgs(const std::string& _path, return false; } - _data.creator = translate_creator(find_creator(buf), &_data.creator_is_gettext); - _data.title = translate_title(find_title(buf), &_data.title_is_gettext); + _data.creator = find_creator(buf); + _data.creator_is_gettext = translate_creator(_data.creator); + _data.title = find_title(buf); + _data.title_is_gettext = translate_title(_data.title); _data.Desc1 = find_desc1(buf); _data.Desc2 = find_desc2(buf); _data.Desc3 = find_desc3(buf); diff --git a/desktop_version/src/CustomLevels.h b/desktop_version/src/CustomLevels.h index ac9fcdf4..97e3448d 100644 --- a/desktop_version/src/CustomLevels.h +++ b/desktop_version/src/CustomLevels.h @@ -171,9 +171,9 @@ public: bool onewaycol_override; }; -std::string translate_title(const std::string& title, bool* is_gettext); +bool translate_title(const std::string& title); -std::string translate_creator(const std::string& creator, bool* is_gettext); +bool translate_creator(const std::string& creator); #ifndef CL_DEFINITION extern customlevelclass cl; diff --git a/desktop_version/src/Editor.cpp b/desktop_version/src/Editor.cpp index 22ddf006..57fdb0de 100644 --- a/desktop_version/src/Editor.cpp +++ b/desktop_version/src/Editor.cpp @@ -544,13 +544,31 @@ static void editormenurender(int tr, int tg, int tb) } else { - bool title_is_gettext; - std::string title = translate_title(cl.title, &title_is_gettext); + const char* title = cl.title.c_str(); + const bool title_is_gettext = translate_title(cl.title); + if (title_is_gettext) + { + title = loc::gettext(title); + } font::print(PR_2X | PR_CEN | (title_is_gettext ? PR_FONT_INTERFACE : PR_FONT_LEVEL), -1, 35, title, tr, tg, tb); } - bool creator_is_gettext = false; - std::string creator = (ed.current_text_mode == TEXT_CREATOR) ? input_text : translate_creator(cl.creator, &creator_is_gettext); + bool creator_is_gettext; + const char* creator; + if (ed.current_text_mode == TEXT_CREATOR) + { + creator_is_gettext = false; + creator = input_text.c_str(); + } + else + { + creator_is_gettext = translate_creator(cl.creator); + creator = cl.creator.c_str(); + } + if (creator_is_gettext) + { + creator = loc::gettext(creator); + } int sp = SDL_max(10, font::height(PR_FONT_LEVEL)); graphics.print_level_creator((creator_is_gettext ? PR_FONT_INTERFACE : PR_FONT_LEVEL), 60, creator, tr, tg, tb); @@ -2653,8 +2671,7 @@ static void editormenuactionpress(void) { case 0: { - bool title_is_gettext; - translate_title(cl.title, &title_is_gettext); + const bool title_is_gettext = translate_title(cl.title); ed.current_text_mode = TEXT_TITLE; ed.substate = EditorSubState_MENU_INPUT; @@ -2673,8 +2690,7 @@ static void editormenuactionpress(void) } case 1: { - bool creator_is_gettext; - translate_creator(cl.creator, &creator_is_gettext); + const bool creator_is_gettext = translate_creator(cl.creator); ed.current_text_mode = TEXT_CREATOR; ed.substate = EditorSubState_MENU_INPUT; diff --git a/desktop_version/src/Game.cpp b/desktop_version/src/Game.cpp index 151cef1f..035070cf 100644 --- a/desktop_version/src/Game.cpp +++ b/desktop_version/src/Game.cpp @@ -6638,6 +6638,11 @@ void Game::createmenu( enum Menu::MenuName t, bool samemenu/*= false*/ ) prefix = ""; break; } + const char* title = cl.ListOfMetaData[i].title.c_str(); + if (cl.ListOfMetaData[i].title_is_gettext) + { + title = loc::gettext(title); + } /* We have to make sure the stars and spaces are consistently on the * correct side of the title, no matter what bidi characters are in there. * So just always let the bidi engine handle it, with a few control chars. */ @@ -6650,7 +6655,7 @@ void Game::createmenu( enum Menu::MenuName t, bool samemenu/*= false*/ ) prefix, // FIRST STRONG ISOLATE, to start an isolated block oriented however bidi sees fit UTF8_encode(0x2068).bytes, - cl.ListOfMetaData[i].title.c_str(), + title, // POP DIRECTIONAL ISOLATE, exit isolated level title UTF8_encode(0x2069).bytes ); diff --git a/desktop_version/src/Render.cpp b/desktop_version/src/Render.cpp index 20b6436b..82132350 100644 --- a/desktop_version/src/Render.cpp +++ b/desktop_version/src/Render.cpp @@ -272,10 +272,20 @@ static void menurender(void) ); uint32_t title_flags = cl.ListOfMetaData[tmp].title_is_gettext ? PR_FONT_INTERFACE : level_flags; uint32_t creator_flags = cl.ListOfMetaData[tmp].creator_is_gettext ? PR_FONT_INTERFACE : level_flags; + const char* title = cl.ListOfMetaData[tmp].title.c_str(); + if (cl.ListOfMetaData[tmp].title_is_gettext) + { + title = loc::gettext(title); + } + const char* creator = cl.ListOfMetaData[tmp].creator.c_str(); + if (cl.ListOfMetaData[tmp].creator_is_gettext) + { + creator = loc::gettext(creator); + } - font::print(title_flags | PR_2X | PR_CEN, -1, 15, cl.ListOfMetaData[tmp].title, tr, tg, tb); + font::print(title_flags | PR_2X | PR_CEN, -1, 15, title, tr, tg, tb); int sp = SDL_max(10, font::height(level_flags)); - graphics.print_level_creator(creator_flags, 40, cl.ListOfMetaData[tmp].creator, tr, tg, tb); + graphics.print_level_creator(creator_flags, 40, creator, tr, tg, tb); font::print(level_flags | PR_CEN, -1, 40+sp, cl.ListOfMetaData[tmp].website, tr, tg, tb); font::print(level_flags | PR_CEN, -1, 40+sp*3, cl.ListOfMetaData[tmp].Desc1, tr, tg, tb); font::print(level_flags | PR_CEN, -1, 40+sp*4, cl.ListOfMetaData[tmp].Desc2, tr, tg, tb);