From 8fcad02f5d5a000b331be8c6c10acb5a6e73d7da Mon Sep 17 00:00:00 2001 From: Evil Eye Date: Mon, 8 Dec 2025 11:25:23 +0100 Subject: [PATCH] Don't use external formatting for l10n strings --- apps/openmw/engine.cpp | 6 ++---- apps/openmw/mwstate/statemanagerimp.cpp | 7 ++----- components/l10n/messagebundles.cpp | 12 ++++++++---- components/l10n/messagebundles.hpp | 1 + files/data-mw/l10n/OMWEngine/gmst.yaml | 5 ++++- files/data/l10n/OMWEngine/de.yaml | 4 ++-- files/data/l10n/OMWEngine/en.yaml | 4 ++-- files/data/l10n/OMWEngine/fr.yaml | 4 ++-- files/data/l10n/OMWEngine/pl.yaml | 4 ++-- files/data/l10n/OMWEngine/ru.yaml | 4 ++-- files/data/l10n/OMWEngine/sv.yaml | 4 ++-- 11 files changed, 29 insertions(+), 26 deletions(-) diff --git a/apps/openmw/engine.cpp b/apps/openmw/engine.cpp index fcb2f9db9c..66bd16ea3e 100644 --- a/apps/openmw/engine.cpp +++ b/apps/openmw/engine.cpp @@ -124,10 +124,8 @@ namespace return; } - std::string messageFormat - = MWBase::Environment::get().getL10nManager()->getMessage("OMWEngine", "ScreenshotMade"); - - std::string message = Misc::StringUtils::format(messageFormat, filePath); + auto l10n = MWBase::Environment::get().getL10nManager()->getContext("OMWEngine"); + std::string message = l10n->formatMessage("ScreenshotMade", { "file" }, { L10n::toUnicode(filePath) }); MWBase::Environment::get().getWindowManager()->scheduleMessageBox( std::move(message), MWGui::ShowInDialogueMode_Never); diff --git a/apps/openmw/mwstate/statemanagerimp.cpp b/apps/openmw/mwstate/statemanagerimp.cpp index 549bacb887..e47bf3e3e0 100644 --- a/apps/openmw/mwstate/statemanagerimp.cpp +++ b/apps/openmw/mwstate/statemanagerimp.cpp @@ -148,11 +148,8 @@ void MWState::StateManager::askLoadRecent() std::vector buttons; buttons.emplace_back("#{Interface:Yes}"); buttons.emplace_back("#{Interface:No}"); - std::string message - = MWBase::Environment::get().getL10nManager()->getMessage("OMWEngine", "AskLoadLastSave"); - std::string_view tag = "%s"; - size_t pos = message.find(tag); - message.replace(pos, tag.length(), saveName); + auto l10n = MWBase::Environment::get().getL10nManager()->getContext("OMWEngine"); + std::string message = l10n->formatMessage("AskLoadLastSave", { "save" }, { L10n::toUnicode(saveName) }); MWBase::Environment::get().getWindowManager()->interactiveMessageBox(message, buttons); mAskLoadRecent = true; } diff --git a/components/l10n/messagebundles.cpp b/components/l10n/messagebundles.cpp index b1ccbd6b47..a8e9828d02 100644 --- a/components/l10n/messagebundles.cpp +++ b/components/l10n/messagebundles.cpp @@ -48,8 +48,7 @@ namespace L10n std::optional parseMessageFormat( const icu::Locale& lang, std::string_view key, std::string_view value, std::string_view locale) { - icu::UnicodeString pattern - = icu::UnicodeString::fromUTF8(icu::StringPiece(value.data(), static_cast(value.size()))); + icu::UnicodeString pattern = toUnicode(value); icu::ErrorCode status; UParseError parseError; icu::MessageFormat message(pattern, lang, parseError, status); @@ -308,8 +307,7 @@ namespace L10n std::vector argValues; for (auto& [k, v] : args) { - argNames.push_back( - icu::UnicodeString::fromUTF8(icu::StringPiece(k.data(), static_cast(k.size())))); + argNames.push_back(toUnicode(k)); argValues.push_back(v); } return formatMessage(key, argNames, argValues); @@ -338,4 +336,10 @@ namespace L10n return std::string(key); return formatArgs(*defaultMessage, key, argNames, args); } + + icu::UnicodeString toUnicode(std::string_view value) + { + icu::StringPiece piece(value.data(), static_cast(value.size())); + return icu::UnicodeString::fromUTF8(piece); + } } diff --git a/components/l10n/messagebundles.hpp b/components/l10n/messagebundles.hpp index ac67c94ff0..164225e09d 100644 --- a/components/l10n/messagebundles.hpp +++ b/components/l10n/messagebundles.hpp @@ -74,6 +74,7 @@ namespace L10n const icu::MessageFormat* findMessage(std::string_view key, std::string_view localeName) const; }; + icu::UnicodeString toUnicode(std::string_view value); } #endif // COMPONENTS_L10N_MESSAGEBUNDLES_H diff --git a/files/data-mw/l10n/OMWEngine/gmst.yaml b/files/data-mw/l10n/OMWEngine/gmst.yaml index 1292a0e87d..598d82bad2 100644 --- a/files/data-mw/l10n/OMWEngine/gmst.yaml +++ b/files/data-mw/l10n/OMWEngine/gmst.yaml @@ -1,4 +1,7 @@ -AskLoadLastSave: "sLoadLastSaveMsg" +AskLoadLastSave: + pattern: "{gmst:sLoadLastSaveMsg}" + variables: + - ["save"] AudioEffects: "sEffects" AudioFootsteps: "sFootsteps" AudioMaster: "sMaster" diff --git a/files/data/l10n/OMWEngine/de.yaml b/files/data/l10n/OMWEngine/de.yaml index 782ae50824..3208887b12 100644 --- a/files/data/l10n/OMWEngine/de.yaml +++ b/files/data/l10n/OMWEngine/de.yaml @@ -12,7 +12,7 @@ PhysicsProfiler: "Physik-Profiler" # Messages -AskLoadLastSave: "Der aktuellste Spielstand ist '%s'. Soll er geladen werden?" +AskLoadLastSave: "Der aktuellste Spielstand ist '{save}'. Soll er geladen werden?" BuildingNavigationMesh: "Erstelle Navigationsgitter..." InitializingData: "Initialisiere Daten..." LoadingExterior: "Lade Bereich..." @@ -30,7 +30,7 @@ QuitGameConfirmation: "Spiel verlassen?" SaveGameDenied: "Das Spiel kann gerade nicht gespeichert werden!" SavingInProgress: "Speichere Spiel..." ScreenshotFailed: "Speichern des Screenshots fehlgeschlagen!" -ScreenshotMade: "%s wurde gespeichert." +ScreenshotMade: "{file} wurde gespeichert." # Save game menu diff --git a/files/data/l10n/OMWEngine/en.yaml b/files/data/l10n/OMWEngine/en.yaml index 4ec744ce80..a121be11ae 100644 --- a/files/data/l10n/OMWEngine/en.yaml +++ b/files/data/l10n/OMWEngine/en.yaml @@ -12,7 +12,7 @@ PhysicsProfiler: "Physics Profiler" # Messages -AskLoadLastSave: "The most recent save is '%s'. Do you want to load it?" +AskLoadLastSave: "The most recent save is '{save}'. Do you want to load it?" BuildingNavigationMesh: "Building Navigation Mesh" InitializingData: "Initializing Data..." LoadingExterior: "Loading Area" @@ -30,7 +30,7 @@ QuitGameConfirmation: "Quit the game?" SaveGameDenied: "The game cannot be saved right now." SavingInProgress: "Saving..." ScreenshotFailed: "Failed to save screenshot" -ScreenshotMade: "%s has been saved" +ScreenshotMade: "{file} has been saved" # Save game menu diff --git a/files/data/l10n/OMWEngine/fr.yaml b/files/data/l10n/OMWEngine/fr.yaml index 808d15b4d8..a6b6f047ba 100644 --- a/files/data/l10n/OMWEngine/fr.yaml +++ b/files/data/l10n/OMWEngine/fr.yaml @@ -13,7 +13,7 @@ PhysicsProfiler: "Profileur des performances de la physique" # Messages BuildingNavigationMesh: "Construction du mesh de navigation" -AskLoadLastSave: "La sauvegarde la plus récente est '%s'. Voulez-vous la charger ?" +AskLoadLastSave: "La sauvegarde la plus récente est '{save}'. Voulez-vous la charger ?" InitializingData: "Initialisation des données..." LoadingExterior: "Chargement de la zone de jeu" LoadingFailed: "Échec du chargement de la sauvegarde" @@ -30,7 +30,7 @@ QuitGameConfirmation: "Quitter la partie ?" SaveGameDenied: "Sauvegarde impossible" SavingInProgress: "Sauvegarde en cours..." ScreenshotFailed: "Échec de la sauvegarde de la capture d'écran" -ScreenshotMade: "Capture d'écran %s sauvegardée" +ScreenshotMade: "Capture d'écran {file} sauvegardée" # Save game menu diff --git a/files/data/l10n/OMWEngine/pl.yaml b/files/data/l10n/OMWEngine/pl.yaml index 58310954e2..bda86c96bd 100644 --- a/files/data/l10n/OMWEngine/pl.yaml +++ b/files/data/l10n/OMWEngine/pl.yaml @@ -12,7 +12,7 @@ PhysicsProfiler: "Profilowanie fizyki" # Messages -AskLoadLastSave: "Ostatni zapis to '%s'. Czy chcesz go wczytać?" +AskLoadLastSave: "Ostatni zapis to '{save}'. Czy chcesz go wczytać?" BuildingNavigationMesh: "Tworzenie siatki nawigacyjnej" InitializingData: "Inicjalizacja..." LoadingExterior: "Wczytywanie obszaru zewnętrznego" @@ -30,7 +30,7 @@ QuitGameConfirmation: "Wyjść z gry?" SaveGameDenied: "Gra nie może być teraz zapisana." SavingInProgress: "Zapisywanie..." ScreenshotFailed: "Nie udało się zapisać zrzutu ekranu" -ScreenshotMade: "%s został zapisany" +ScreenshotMade: "{file} został zapisany" # Save game menu diff --git a/files/data/l10n/OMWEngine/ru.yaml b/files/data/l10n/OMWEngine/ru.yaml index b780ba1e05..66739270c3 100644 --- a/files/data/l10n/OMWEngine/ru.yaml +++ b/files/data/l10n/OMWEngine/ru.yaml @@ -12,7 +12,7 @@ PhysicsProfiler: "Профилировщик физики" # Messages -AskLoadLastSave: "Последнее сохранение - '%s'. Загрузить?" +AskLoadLastSave: "Последнее сохранение - '{save}'. Загрузить?" BuildingNavigationMesh: "Построение навигационной сетки" InitializingData: "Загрузка..." LoadingExterior: "Загрузка области" @@ -30,7 +30,7 @@ QuitGameConfirmation: "Выйти из игры?" SaveGameDenied: "В данный момент игру нельзя сохранить." SavingInProgress: "Сохранение..." ScreenshotFailed: "Не удалось создать снимок экрана" -ScreenshotMade: "Создан снимок экрана %s" +ScreenshotMade: "Создан снимок экрана {file}" # Save game menu diff --git a/files/data/l10n/OMWEngine/sv.yaml b/files/data/l10n/OMWEngine/sv.yaml index c5ad166849..bd2204ab09 100644 --- a/files/data/l10n/OMWEngine/sv.yaml +++ b/files/data/l10n/OMWEngine/sv.yaml @@ -12,7 +12,7 @@ PhysicsProfiler: "Fysikprofilerare" # Messages -AskLoadLastSave: "Den senaste sparfilen är '%s'. Vill du ladda den?" +AskLoadLastSave: "Den senaste sparfilen är '{save}'. Vill du ladda den?" BuildingNavigationMesh: "Bygger navigeringsmesh" InitializingData: "Initialiserar data..." LoadingExterior: "Laddar område" @@ -30,7 +30,7 @@ QuitGameConfirmation: "Avsluta spelet?" SaveGameDenied: "Spelet kan inte sparas just nu." SavingInProgress: "Sparar..." ScreenshotFailed: "Misslyckades att spara skärmdump" -ScreenshotMade: "%s har sparats" +ScreenshotMade: "{file} har sparats" # Save game menu