From 8fcad02f5d5a000b331be8c6c10acb5a6e73d7da Mon Sep 17 00:00:00 2001 From: Evil Eye Date: Mon, 8 Dec 2025 11:25:23 +0100 Subject: [PATCH 1/5] 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 From 570e0feed50dac818d511995c232451d09552a6c Mon Sep 17 00:00:00 2001 From: Evil Eye Date: Mon, 8 Dec 2025 12:38:37 +0100 Subject: [PATCH 2/5] Use l10n for setting label captions --- apps/openmw/mwgui/layout.cpp | 2 +- apps/openmw/mwgui/layout.hpp | 4 +- apps/openmw/mwgui/settingswindow.cpp | 70 +++++++++++-------- apps/openmw/mwgui/settingswindow.hpp | 2 +- files/data-mw/l10n/OMWEngine/gmst.yaml | 6 ++ files/data/l10n/OMWEngine/de.yaml | 11 +++ files/data/l10n/OMWEngine/en.yaml | 11 +++ files/data/l10n/OMWEngine/fr.yaml | 11 +++ files/data/l10n/OMWEngine/pl.yaml | 11 +++ files/data/l10n/OMWEngine/ru.yaml | 11 +++ files/data/l10n/OMWEngine/sv.yaml | 11 +++ .../data/mygui/openmw_settings_window.layout | 22 +++--- 12 files changed, 128 insertions(+), 44 deletions(-) diff --git a/apps/openmw/mwgui/layout.cpp b/apps/openmw/mwgui/layout.cpp index 9a5f0af7b3..d350dabfe6 100644 --- a/apps/openmw/mwgui/layout.cpp +++ b/apps/openmw/mwgui/layout.cpp @@ -62,7 +62,7 @@ namespace MWGui window->setCaptionWithReplacing(MyGUI::UString(title)); } - MyGUI::Widget* Layout::getWidget(std::string_view name) + MyGUI::Widget* Layout::getWidget(std::string_view name) const { std::string target = mPrefix; target += name; diff --git a/apps/openmw/mwgui/layout.hpp b/apps/openmw/mwgui/layout.hpp index 8f890a68f9..38ee3439bb 100644 --- a/apps/openmw/mwgui/layout.hpp +++ b/apps/openmw/mwgui/layout.hpp @@ -35,10 +35,10 @@ namespace MWGui } } - MyGUI::Widget* getWidget(std::string_view name); + MyGUI::Widget* getWidget(std::string_view name) const; template - void getWidget(T*& widget, std::string_view name) + void getWidget(T*& widget, std::string_view name) const { MyGUI::Widget* w = getWidget(name); T* cast = w->castType(false); diff --git a/apps/openmw/mwgui/settingswindow.cpp b/apps/openmw/mwgui/settingswindow.cpp index c8c97d1796..6b73bd9f87 100644 --- a/apps/openmw/mwgui/settingswindow.cpp +++ b/apps/openmw/mwgui/settingswindow.cpp @@ -1,7 +1,6 @@ #include "settingswindow.hpp" #include -#include #include @@ -24,7 +23,6 @@ #include #include #include -#include #include #include #include @@ -139,6 +137,18 @@ namespace else box->setIndexSelected(MyGUI::ITEM_NONE); } + + void updateSliderLabel(MyGUI::ScrollBar* scroller, MyGUI::TextBox* textBox, + const std::vector& argNames, const std::vector& args) + { + if (textBox != nullptr) + { + auto l10n = MWBase::Environment::get().getL10nManager()->getContext("OMWEngine"); + std::string labelCaption + = l10n->formatMessage(scroller->getUserString("SettingLabelCaption"), argNames, args); + textBox->setCaption(labelCaption); + } + } } namespace MWGui @@ -163,8 +173,9 @@ namespace MWGui if (type == sliderType) { MyGUI::ScrollBar* scroll = current->castType(); - std::string valueStr; std::string_view valueType = getSettingValueType(current); + std::vector argNames; + std::vector args; if (valueType == "Float" || valueType == "Integer" || valueType == "Cell") { // TODO: ScrollBar isn't meant for this. should probably use a dedicated FloatSlider widget @@ -175,21 +186,20 @@ namespace MWGui if (valueType == "Cell") { value = Settings::get(getSettingCategory(current), getSettingName(current)); - std::stringstream ss; - ss << std::fixed << std::setprecision(2) << value / Constants::CellSizeInUnits; - valueStr = ss.str(); + argNames.emplace_back("cells"); + args.emplace_back(value / Constants::CellSizeInUnits); } else if (valueType == "Float") { value = Settings::get(getSettingCategory(current), getSettingName(current)); - std::stringstream ss; - ss << std::fixed << std::setprecision(2) << value; - valueStr = ss.str(); + argNames.emplace_back("value"); + args.emplace_back(value); } else { const int intValue = Settings::get(getSettingCategory(current), getSettingName(current)); - valueStr = MyGUI::utility::toString(intValue); + argNames.emplace_back("value"); + args.emplace_back(intValue); value = static_cast(intValue); } @@ -201,14 +211,15 @@ namespace MWGui else { const int value = Settings::get(getSettingCategory(current), getSettingName(current)); - valueStr = MyGUI::utility::toString(value); + argNames.emplace_back("value"); + args.emplace_back(value); scroll->setScrollPosition(value); } if (init) scroll->eventScrollChangePosition += MyGUI::newDelegate(this, &SettingsWindow::onSliderChangePosition); if (scroll->getVisible()) - updateSliderLabel(scroll, valueStr); + updateSliderLabel(scroll, getSliderLabel(scroll), argNames, args); } configureWidgets(current, init); @@ -225,17 +236,16 @@ namespace MWGui } } - void SettingsWindow::updateSliderLabel(MyGUI::ScrollBar* scroller, const std::string& value) + MyGUI::TextBox* SettingsWindow::getSliderLabel(MyGUI::ScrollBar* scroller) const { auto labelWidgetName = scroller->getUserString("SettingLabelWidget"); if (!labelWidgetName.empty()) { MyGUI::TextBox* textBox; getWidget(textBox, labelWidgetName); - std::string labelCaption{ scroller->getUserString("SettingLabelCaption") }; - labelCaption = Misc::StringUtils::format(labelCaption, value); - textBox->setCaptionWithReplacing(labelCaption); + return textBox; } + return nullptr; } SettingsWindow::SettingsWindow(Files::ConfigurationManager& cfgMgr) @@ -719,7 +729,8 @@ namespace MWGui { if (getSettingType(scroller) == "Slider") { - std::string valueStr; + std::vector argNames; + std::vector args; std::string_view valueType = getSettingValueType(scroller); if (valueType == "Float" || valueType == "Integer" || valueType == "Cell") { @@ -732,30 +743,31 @@ namespace MWGui if (valueType == "Cell") { Settings::get(getSettingCategory(scroller), getSettingName(scroller)).set(value); - std::stringstream ss; - ss << std::fixed << std::setprecision(2) << value / Constants::CellSizeInUnits; - valueStr = ss.str(); + argNames.emplace_back("cells"); + args.emplace_back(value / Constants::CellSizeInUnits); } else if (valueType == "Float") { Settings::get(getSettingCategory(scroller), getSettingName(scroller)).set(value); - std::stringstream ss; - ss << std::fixed << std::setprecision(2) << value; - valueStr = ss.str(); + argNames.emplace_back("value"); + args.emplace_back(value); } else { - Settings::get(getSettingCategory(scroller), getSettingName(scroller)) - .set(static_cast(value)); - valueStr = MyGUI::utility::toString(int(value)); + int intValue = static_cast(value); + Settings::get(getSettingCategory(scroller), getSettingName(scroller)).set(intValue); + argNames.emplace_back("value"); + args.emplace_back(intValue); } } else { - Settings::get(getSettingCategory(scroller), getSettingName(scroller)).set(static_cast(pos)); - valueStr = MyGUI::utility::toString(pos); + int intValue = static_cast(pos); + Settings::get(getSettingCategory(scroller), getSettingName(scroller)).set(intValue); + argNames.emplace_back("value"); + args.emplace_back(intValue); } - updateSliderLabel(scroller, valueStr); + updateSliderLabel(scroller, getSliderLabel(scroller), argNames, args); apply(); } diff --git a/apps/openmw/mwgui/settingswindow.hpp b/apps/openmw/mwgui/settingswindow.hpp index 45eda0f315..60b3e26372 100644 --- a/apps/openmw/mwgui/settingswindow.hpp +++ b/apps/openmw/mwgui/settingswindow.hpp @@ -116,7 +116,7 @@ namespace MWGui void apply(); void configureWidgets(MyGUI::Widget* widget, bool init); - void updateSliderLabel(MyGUI::ScrollBar* scroller, const std::string& value); + MyGUI::TextBox* getSliderLabel(MyGUI::ScrollBar* scroller) const; void layoutControlsBox(); void renderScriptSettings(); diff --git a/files/data-mw/l10n/OMWEngine/gmst.yaml b/files/data-mw/l10n/OMWEngine/gmst.yaml index 598d82bad2..2d9944cc59 100644 --- a/files/data-mw/l10n/OMWEngine/gmst.yaml +++ b/files/data-mw/l10n/OMWEngine/gmst.yaml @@ -23,6 +23,8 @@ DetailLevel: "sDetail_Level" DifficultyEasy: "sEasy" DifficultyHard: "sHard" Difficulty: "sDifficulty" +DifficultyValue: + pattern: "{gmst:sDifficulty} ({value})" DistanceHigh: "sFar" DistanceLow: "sNear" EmptySaveNameError: "sNotifyMessage65" @@ -62,3 +64,7 @@ TransparencyFull: "sFull" TransparencyNone: "sNone" Video: "sVideo" ViewDistance: "sRender_Distance" +ViewDistanceValue: + pattern: "{gmst:sRender_Distance} ({value, number, ::.00})" +ViewDistanceValueCells: + pattern: "{gmst:sRender_Distance} (×{cells, number, ::.00})" diff --git a/files/data/l10n/OMWEngine/de.yaml b/files/data/l10n/OMWEngine/de.yaml index 3208887b12..618d22c28a 100644 --- a/files/data/l10n/OMWEngine/de.yaml +++ b/files/data/l10n/OMWEngine/de.yaml @@ -65,7 +65,9 @@ TimePlayed: "Spielzeit" # Settings menu ActorsProcessingRange: "Akteur-Verarbeitungsreichweite" +ActorsProcessingRangeValue: "Akteur-Verarbeitungsreichweite ({value, number, :: group-off})" Anisotropy: "Anisotropie" +AnisotropyValue: "Anisotropie ({value})" Audio: "Audio" AudioMaster: "Master-Lautstärke" AudioVoice: "Stimmen" @@ -98,12 +100,14 @@ DelayLow: "Schnell" DelayHigh: "Langsam" DetailLevel: "Detailgrad" Difficulty: "Schwierigkeitsgrad" +DifficultyValue: "Schwierigkeitsgrad ({value})" DifficultyEasy: "Leicht" DifficultyHard: "Schwer" DistanceHigh: "Weit" DistanceLow: "Kurz" EnableController: "Controller aktivieren" FieldOfView: "Sichtfeld" +FieldOfViewValue: "Sichtfeld ({value, number, ::.00})" FieldOfViewLow: "Niedrig" FieldOfViewHigh: "Hoch" ForcePerPixelLighting: "Beleuchtung pro Pixel" @@ -131,16 +135,20 @@ LightingMethodShadersCompatibility: "Shader (Kompatibilitätsmodus)" LightingResetToDefaults: "Einstellungen wirklich zurücksetzen? Das Ändern der „Beleuchtungsmethode“ erfordert einen Neustart." Lights: "Beleuchtung" LightsBoundingSphereMultiplier: "Multiplikator für Begrenzungssphäre" +LightsBoundingSphereMultiplierValue: "Multiplikator für Begrenzungssphäre ({value, number, ::.00})" LightsBoundingSphereMultiplierTooltip: "Standard: 1,65\nMultiplikator für Größe der Begrenzungssphäre.\nGrößere Werte ermöglichen einen sanfteren Abfall, erfordern jedoch eine Erhöhung der maximalen Anzahl von Lichtquellen.\n\nBeeinflusst nicht die Beleuchtung oder Lichtintensität." LightsFadeStartMultiplier: "Multiplikator für Startwert der Lichtabblendung" +LightsFadeStartMultiplierValue: "Multiplikator für Startwert der Lichtabblendung ({value, number, ::.00})" LightsFadeStartMultiplierTooltip: "Standard: 0,85\nBruchteil der maximalen Lichtreichweite, bei der Lichtquellen langsam zu verblassen beginnen.\n\nKleinere Werte führen zu einem sanfteren Übergang, der allerdings bereits bei geringerer Entfernung startet; größere Werte machen den Übergang abrupter, betreffen aber nur weiter entfernte Lichtquellen." LightsLightingMethodTooltip: "Legt die interne Behandlung von Lichtquellen fest.\n\n „Veraltet“ verwendet immer bis zu 8 Lichtquellen pro Objekt und führt zu Ergebnissen, die denen der Original-Engine am ähnlichsten sind.\n\n „Shader (Kompatibilitätsmodus)“ entfernt das Maximum von 8 Lichtquellen pro Objekt; Bodenvegetation wird von Lichtquellen beleuchtet. Es wird empfohlen, diese Option für ältere Hardware und Maximalwerte für Lichtquellen nahe 8 zu verwenden.\n\n „Shader“ bietet alle Vorteile von „Shader (Kompatibilitätsmodus)“, nutzt aber einen moderneren Ansatz, der größere Maximalwerte für Lichtquellen bei geringen bis keinen Leistungseinbußen ermöglicht. Funktioniert möglicherweise nicht auf älterer Hardware." LightsMaximumDistance: "Maximale Lichtreichweite" +LightsMaximumDistanceValue: "Maximale Lichtreichweite ({value, number, :: group-off})" LightsMaximumDistanceTooltip: "Standard: 8192 (1 Zelle)\nMaximale Entfernung, bis zu der Lichtquellen noch dargestellt werden (gemessen in In-Game-Einheiten).\n\nEin Wert von 0 entspricht einer unbegrenzten Reichweite." LightsMinimumInteriorBrightness: "Minimale Helligkeit in Innenräumen" +LightsMinimumInteriorBrightness: "Minimale Helligkeit in Innenräumen ({value, number, ::.00})" LightsMinimumInteriorBrightnessTooltip: "Standard: 0,08\nMinimale Umgebungshelligkeit in Innenräumen.\n\nKann erhöht werden, falls Innenräume zu dunkel dargestellt werden.\n\nDies hat keine Auswirkung, wenn der klassische Lichtabfall verwendet wird." MatchSunlightToSun: "Licht an Sonne ausrichten" MatchSunlightToSunTooltip: |- @@ -149,6 +157,7 @@ MatchSunlightToSunTooltip: |- Diese Option passt die Position der Sonnenlichtquelle an die sichtbare Position der Sonne an. MaxLights: "Maximale Anzahl von Lichtquellen pro Objekt" +MaxLightsValue: "Maximale Anzahl von Lichtquellen pro Objekt ({value, number, ::.00})" MaxLightsTooltip: "Standard: 8\nMaximale Anzahl von Lichtquellen, die ein Objekt beleuchten können.\n\nKleine Werte können gerade an Orten mit vielen Lichtquellen zum Aufploppen und zum schnellen Wechsel von Lichtern führen, wie es aus der Original-Engine und anderen The-Elder-Scrolls-Titeln bekannt ist." MenuHelpDelay: "Verzögerung des Hilfe-Menüs" MenuTransparency: "Menü-Transparenz" @@ -200,6 +209,8 @@ TransparencyFull: "Vollständig" TransparencyNone: "Keine" Video: "Video" ViewDistance: "Sichtweite" +ViewDistanceValue: "Sichtweite ({value, number, ::.00})" +ViewDistanceValueCells: "Sichtweite (×{cells, number, ::.00})" VSync: "VSync" VSyncAdaptive: "Adaptiv" Water: "Wasser" diff --git a/files/data/l10n/OMWEngine/en.yaml b/files/data/l10n/OMWEngine/en.yaml index a121be11ae..d8407a3446 100644 --- a/files/data/l10n/OMWEngine/en.yaml +++ b/files/data/l10n/OMWEngine/en.yaml @@ -65,7 +65,9 @@ TimePlayed: "Time Played" # Settings menu ActorsProcessingRange: "Actors Processing Range" +ActorsProcessingRangeValue: "Actors Processing Range ({value, number, :: group-off})" Anisotropy: "Anisotropy" +AnisotropyValue: "Anisotropy ({value})" Audio: "Audio" AudioEffects: "Effects" AudioFootsteps: "Footsteps" @@ -98,12 +100,14 @@ DelayLow: "Fast" DelayHigh: "Slow" DetailLevel: "Detail Level" Difficulty: "Difficulty" +DifficultyValue: "Difficulty ({value})" DifficultyEasy: "Easy" DifficultyHard: "Hard" DistanceHigh: "Far" DistanceLow: "Near" EnableController: "Enable Controller" FieldOfView: "Field of View" +FieldOfViewValue: "Field of View ({value, number, ::.00})" FieldOfViewHigh: "High" FieldOfViewLow: "Low" ForcePerPixelLighting: "Per-Pixel Lighting" @@ -131,16 +135,20 @@ LightingMethodShadersCompatibility: "Shaders (compatibility)" LightingResetToDefaults: "Resets to default values, would you like to continue? Changes to lighting method will require a restart." Lights: "Lights" LightsBoundingSphereMultiplier: "Bounding Sphere Multiplier" +LightsBoundingSphereMultiplierValue: "Bounding Sphere Multiplier ({value, number, ::.00})" LightsBoundingSphereMultiplierTooltip: "Default: 1.65\nMultiplier for bounding sphere of lights.\nHigher numbers allows for smooth falloff but require an increase in number of max lights.\n\nDoes not effect the illumination or strength of lights." LightsFadeStartMultiplier: "Fade Start Multiplier" +LightsFadeStartMultiplierValue: "Fade Start Multiplier ({value, number, ::.00})" LightsFadeStartMultiplierTooltip: "Default: 0.85\nFraction of maximum distance at which lights will start to fade.\n\nSet this to a low value for slower transitions or a high value for quicker transitions." LightsLightingMethodTooltip: "Set the internal handling of light sources.\n\n \"Legacy\" always uses 8 lights per object. It provides results most similar to Morrowind's lighting.\n\n \"Shaders (compatibility)\" removes the 8 light limit. This mode also enables lighting on groundcover. It is recommended to use this with older hardware and a light limit closer to 8.\n\n \"Shaders\" carries all of the benefits that \"Shaders (compatibility)\" does, but uses a modern approach that allows for a higher max lights count with little to no performance penalties on modern hardware." LightsMaximumDistance: "Maximum Light Distance" +LightsMaximumDistanceValue: "Maximum Light Distance ({value, number, :: group-off})" LightsMaximumDistanceTooltip: "Default: 8192\nMaximum distance at which lights will appear (measured in units).\n\nSet this to 0 to use an unlimited distance." LightsMinimumInteriorBrightness: "Minimum Interior Brightness" +LightsMinimumInteriorBrightness: "Minimum Interior Brightness ({value, number, ::.00})" LightsMinimumInteriorBrightnessTooltip: "Default: 0.08\nMinimum ambient interior brightness.\n\nIncrease this if you feel interiors are too dark.\n\nThis has no effect if classic falloff is used." MatchSunlightToSun: "Match Sunlight to Sun" MatchSunlightToSunTooltip: |- @@ -149,6 +157,7 @@ MatchSunlightToSunTooltip: |- This option makes the sun light source's position match the sun's position. MaxLights: "Max Lights" +MaxLightsValue: "Max Lights ({value, number, ::.00})" MaxLightsTooltip: "Default: 8\nMaximum number of lights per object.\n\nA low number near default will cause light popping similar to what you would see with legacy lighting." MenuHelpDelay: "Menu Help Delay" MenuTransparency: "Menu Transparency" @@ -200,6 +209,8 @@ TransparencyFull: "Full" TransparencyNone: "None" Video: "Video" ViewDistance: "View Distance" +ViewDistanceValue: "View Distance ({value, number, ::.00})" +ViewDistanceValueCells: "View Distance (×{cells, number, ::.00})" VSync: "VSync" VSyncAdaptive: "Adaptive" Water: "Water" diff --git a/files/data/l10n/OMWEngine/fr.yaml b/files/data/l10n/OMWEngine/fr.yaml index a6b6f047ba..b00d7fca11 100644 --- a/files/data/l10n/OMWEngine/fr.yaml +++ b/files/data/l10n/OMWEngine/fr.yaml @@ -65,7 +65,9 @@ TimePlayed: "Temps de jeu" # Settings menu ActorsProcessingRange: "Distance de traitement pour les personnages" +ActorsProcessingRangeValue: "Distance de traitement pour les personnages ({value, number, :: group-off})" Anisotropy: "Anisotropie" +AnisotropyValue: "Anisotropie ({value})" Audio: "Audio" AudioEffects: "Ambiance" AudioFootsteps: "Bruits de pas" @@ -98,12 +100,14 @@ DelayHigh: "Lent" DelayLow: "Rapide" DetailLevel: "Niveau de détails" Difficulty: "Difficulté" +DifficultyValue: "Difficulté ({value})" DifficultyEasy: "Facile" DifficultyHard: "Difficile" DistanceHigh: "Lointain" DistanceLow: "Proche" EnableController: "Activer la manette" FieldOfView: "Champ de vision" +FieldOfViewValue: "Champ de vision ({value, number, ::.00})" FieldOfViewHigh: "Étendu" FieldOfViewLow: "Restreint" ForcePerPixelLighting: "Éclairage par pixel" @@ -131,16 +135,20 @@ LightingMethodShadersCompatibility: "Shaders (mode de compatibilité)" LightingResetToDefaults: "Voulez-vous réinitialiser les paramètres d'affichage des lumières à leur valeur par défaut ? Ces changements requièrent un redémarrage de l'application." Lights: "Sources lumineuses" LightsBoundingSphereMultiplier: "Multiplicateur de sphère englobante" +LightsBoundingSphereMultiplierValue: "Multiplicateur de sphère englobante ({value, number, ::.00})" LightsBoundingSphereMultiplierTooltip: "valeur par défaut: 1.65\nMultiplicateur pour le rayon de la sphère incluant les sources lumineuses.\nUn multiplicateur plus élevé permet une extinction plus douce, mais applique un plus grand nombre de sources lumineuses sur chaque objet.\n\nCe paramètre ne modifie ni l'intensité ni la luminance des lumières." LightsFadeStartMultiplier: "Seuil de perte d'éclat lumineux" +LightsFadeStartMultiplierValue: "Seuil de perte d'éclat lumineux ({value, number, ::.00})" LightsFadeStartMultiplierTooltip: "valeur par défaut: 0.85\nFraction de la distance maximale d'une source à partir de laquelle l'intensité lumineuse commence à décroître.\n\nSélectionnez une valeur basse pour une transition douce ou une valeur plus élevée pour une transition plus abrupte." LightsLightingMethodTooltip: "Définit la gestion des sources lumineuses :\n\n \"Traditionnelle\" Chaque objet est éclairé par 8 sources lumineuses. Cet méthode est la plus proche du jeu original.\n\n \"Shaders (mode de compatibilité)\" supprime la limite des 8 sources lumineuses. Cette méthode permet d'éclairer la végétation au sol. Ce choix est recommandé pour les ordinateurs plus anciens avec un nombre de sources lumineuses proche de 8.\n\n \"Shaders\" offre tous les bénéfices apportés par \"Shaders (mode de compatibilité)\", mais utilise une approche moderne. Celle-ci permet, sur du matériel moderne, d'augmenter le nombre de sources lumineuses par objet sans perte de performance." LightsMaximumDistance: "Distance maximale des sources lumineuses" +LightsMaximumDistanceValue: "Distance maximale des sources lumineuses ({value, number, :: group-off})" LightsMaximumDistanceTooltip: "valeur par défaut: 8192\nDistance maximale d'affichage des sources lumineuses (en unité de distance).\n\nMettez cette valeur à 0 pour une distance d'affichage infinie." LightsMinimumInteriorBrightness: "Luminosité intérieure minimale" +LightsMinimumInteriorBrightness: "Luminosité intérieure minimale ({value, number, ::.00})" LightsMinimumInteriorBrightnessTooltip: "valeur par défaut: 0.08\nLuminosité ambiante minimum en intérieur.\n\nAugmentez cette valeur si les intérieurs vous semblent trop sombres.\n\nCela n'a aucun effet si l'atténuation classique est utilisée." MatchSunlightToSun: "Aligner la lumière du soleil" MatchSunlightToSunTooltip: |- @@ -149,6 +157,7 @@ MatchSunlightToSunTooltip: |- Cette option aligne la source lumineuse du soleil sur la position réelle du soleil. MaxLights: "Maximum de sources lumineuses" +MaxLightsValue: "Maximum de sources lumineuses ({value, number, ::.00})" MaxLightsTooltip: "valeur par défaut: 8\nNombre maximum de sources lumineuses par objet.\n\nUne valeur faible mène à des apparitions tardives des sources lumineuses similaires à celles obtenues avec la méthode d'éclairage traditionnelle." MenuHelpDelay: "Délai d'affichage du menu d'aide" MenuTransparency: "Transparence des menus" @@ -200,6 +209,8 @@ TransparencyFull: "Haute" TransparencyNone: "Basse" Video: "Graphisme" ViewDistance: "Distance d'affichage" +ViewDistanceValue: "Distance d'affichage ({value, number, ::.00})" +ViewDistanceValueCells: "Distance d'affichage (×{cells, number, ::.00})" VSync: "VSync" VSyncAdaptive: "Adaptif" Water: "Eau" diff --git a/files/data/l10n/OMWEngine/pl.yaml b/files/data/l10n/OMWEngine/pl.yaml index bda86c96bd..d21f298b74 100644 --- a/files/data/l10n/OMWEngine/pl.yaml +++ b/files/data/l10n/OMWEngine/pl.yaml @@ -65,7 +65,9 @@ TimePlayed: "Czas gry" # Settings menu ActorsProcessingRange: "Zasięg przetwarzania postaci" +ActorsProcessingRangeValue: "Zasięg przetwarzania postaci ({value, number, :: group-off})" Anisotropy: "Anizotropia" +AnisotropyValue: "Anizotropia ({value})" Audio: "Dźwięk" AudioEffects: "Efekty" AudioFootsteps: "Kroki" @@ -98,12 +100,14 @@ DelayLow: "Szybko" DelayHigh: "Wolno" DetailLevel: "Poziom szczegółowości" Difficulty: "Trudność" +DifficultyValue: "Trudność ({value})" DifficultyEasy: "Łatwy" DifficultyHard: "Trudny" DistanceHigh: "Daleko" DistanceLow: "Blisko" EnableController: "Włącz kontroler" FieldOfView: "Pole widzenia" +FieldOfViewValue: "Pole widzenia ({value, number, ::.00})" FieldOfViewHigh: "Szerokie" FieldOfViewLow: "Wąskie" ForcePerPixelLighting: "Oświetlenie per-piksel" @@ -131,16 +135,20 @@ LightingMethodShadersCompatibility: "Shadery (kompatybilne)" LightingResetToDefaults: "Przywrócić domyślne wartości? Zmiany w metodzie oświetlenia wymagają ponownego uruchomienia." Lights: "Światła" LightsBoundingSphereMultiplier: "Mnożnik sfery ograniczającej" +LightsBoundingSphereMultiplierValue: "Mnożnik sfery ograniczającej ({value, number, ::.00})" LightsBoundingSphereMultiplierTooltip: "Domyślnie: 1.65\nMnożnik sfery ograniczającej światła.\nWiększe wartości pozwalają na płynniejsze zanikanie,\nale wymagają zwiększenia liczby maksymalnych świateł.\n\nNie wpływa na siłę ani zasięg światła." LightsFadeStartMultiplier: "Mnożnik początku zanikania" +LightsFadeStartMultiplierValue: "Mnożnik początku zanikania ({value, number, ::.00})" LightsFadeStartMultiplierTooltip: "Domyślnie: 0.85\nProcent maksymalnego zasięgu, w którym światła zaczną zanikać.\n\nNiska wartość = wolniejsze przejścia.\nWysoka wartość = szybsze przejścia." LightsLightingMethodTooltip: "Ustawia wewnętrzne przetwarzanie źródeł światła.\n\n \"Klasyczna\" zawsze używa 8 świateł na obiekt. Najbardziej przypomina oryginalne oświetlenie Morrowinda.\n\n \"Shadery (kompatybilne)\" usuwa limit 8 świateł. Obsługuje również oświetlenie trawy. Zalecane dla starszego sprzętu.\n\n \"Shadery\" oferuje te same zalety co wersja kompatybilna, ale działa nowocześnie i pozwala na więcej świateł bez dużych kosztów wydajności." LightsMaximumDistance: "Maksymalny zasięg światła" +LightsMaximumDistanceValue: "Maksymalny zasięg światła ({value, number, :: group-off})" LightsMaximumDistanceTooltip: "Domyślnie: 8192\nMaksymalna odległość wyświetlania świateł (w jednostkach).\n\n0 = brak ograniczenia." LightsMinimumInteriorBrightness: "Minimalna jasność wnętrz" +LightsMinimumInteriorBrightness: "Minimalna jasność wnętrz ({value, number, ::.00})" LightsMinimumInteriorBrightnessTooltip: "Domyślnie: 0.08\nMinimalna jasność w pomieszczeniach.\n\nZwiększ to, jeśli wnętrza są zbyt ciemne.\n\nNie działa, gdy używana jest klasyczna metoda zanikania." MatchSunlightToSun: "Dopasuj światło słoneczne do pozycji słońca" MatchSunlightToSunTooltip: |- @@ -149,6 +157,7 @@ MatchSunlightToSunTooltip: |- Ta opcja sprawia, że źródło światła słonecznego zgadza się z faktyczną pozycją słońca. MaxLights: "Maksymalna liczba świateł" +MaxLightsValue: "Maksymalna liczba świateł ({value, number, ::.00})" MaxLightsTooltip: "Domyślnie: 8\nMaksymalna liczba świateł na obiekt.\n\nNiska wartość = efekt 'wyskakiwania' świateł, jak w klasycznym trybie." MenuHelpDelay: "Opóźnienie pomocy w menu" MenuTransparency: "Przezroczystość menu" @@ -200,6 +209,8 @@ TransparencyFull: "Pełna" TransparencyNone: "Brak" Video: "Wideo" ViewDistance: "Zasięg widzenia" +ViewDistanceValue: "Zasięg widzenia ({value, number, ::.00})" +ViewDistanceValueCells: "Zasięg widzenia (×{cells, number, ::.00})" VSync: "Synchronizacja pionowa" VSyncAdaptive: "Adaptacyjna" Water: "Woda" diff --git a/files/data/l10n/OMWEngine/ru.yaml b/files/data/l10n/OMWEngine/ru.yaml index 66739270c3..5b5a2dbd1a 100644 --- a/files/data/l10n/OMWEngine/ru.yaml +++ b/files/data/l10n/OMWEngine/ru.yaml @@ -65,7 +65,9 @@ TimePlayed: "Время в игре" # Settings menu ActorsProcessingRange: "Дальность обработки персонажей" +ActorsProcessingRangeValue: "Дальность обработки персонажей ({value, number, :: group-off})" Anisotropy: "Анизотропная фильтрация" +AnisotropyValue: "Анизотропная фильтрация ({value})" Audio: "Звук" AudioEffects: "Эффекты" AudioFootsteps: "Шаги" @@ -98,12 +100,14 @@ DelayLow: "Маленькая" DelayHigh: "Большая" DetailLevel: "Уровень детализации" Difficulty: "Сложность" +DifficultyValue: "Сложность ({value})" DifficultyEasy: "Легко" DifficultyHard: "Сложно" DistanceHigh: "Далеко" DistanceLow: "Близко" EnableController: "Геймпад" FieldOfView: "Поле зрения" +FieldOfViewValue: "Поле зрения ({value, number, ::.00})" FieldOfViewLow: "Маленькое" FieldOfViewHigh: "Большое" ForcePerPixelLighting: "Попиксельное освещение" @@ -131,16 +135,20 @@ LightingMethodShadersCompatibility: "Шейдеры (режим совм-ти)" LightingResetToDefaults: "Обнулить настройки освещения? Смена метода освещения вступит в силу только после перезапуска приложения." Lights: "Освещение" LightsBoundingSphereMultiplier: "Множитель размера ограничивающей сферы" +LightsBoundingSphereMultiplierValue: "Множитель размера ограничивающей сферы ({value, number, ::.00})" LightsBoundingSphereMultiplierTooltip: "Значение по умолчанию: 1.65\nМножитель размера ограничивающей сферы источников света.\nВысокие значения делают затухание света плавнее, но требуют более высокого максимального количества источников света.\n\nНастройка не влияет на уровень освещения или мощность источников света." LightsFadeStartMultiplier: "Множитель начала затухания" +LightsFadeStartMultiplierValue: "Множитель начала затухания ({value, number, ::.00})" LightsFadeStartMultiplierTooltip: "Значение по умолчанию: 0.85\nДоля расстояния (относительно дальности отображения источников света), на которой свет начинает затухать.\n\nНизкие значения ведут к плавному затуханию, высокие - к резкому." LightsLightingMethodTooltip: "Задает способ обработки источников света.\n\n \"Устаревший\" всегда использует 8 источников света на объект и выдает освещение, наиболее близкое к таковому в оригинальной игре.\n\n \"Шейдеры (режим совместимости)\" убирает ограничение в 8 источников света. Этот режим также позволяет освещению влиять на анимированную траву. Рекомендуется использовать этот режим на устаревшем аппаратном обеспечении и с количеством источников света на объект около 8.\n\n \"Шейдеры\" работает аналогично режиму \"Шейдеры (режим совместимости)\", но использует более современный подход, позволяющий использовать большее количество источников света с минимальным влиянием на производительность на современном аппаратном обеспечении." LightsMaximumDistance: "Дальность отображения источников света" +LightsMaximumDistanceValue: "Дальность отображения источников света ({value, number, :: group-off})" LightsMaximumDistanceTooltip: "Значение по умолчанию: 8192\nМаксимальное расстояние, на котором будут отображаться источники света (во внутриигровых единицах измерения).\n\nЕсли 0, то расстояние не ограничено." LightsMinimumInteriorBrightness: "Минимальный уровень освещения в помещениях" +LightsMinimumInteriorBrightness: "Минимальный уровень освещения в помещениях ({value, number, ::.00})" LightsMinimumInteriorBrightnessTooltip: "Значение по умолчанию: 0.08\nМинимальный уровень фонового освещения в помещениях.\n\nУвеличьте значение, если помещения в игре кажутся слишком темными. Эта настройка не имеет эффекта, если используется классическое угасание." MatchSunlightToSun: "Свет солнца идет от солнца" MatchSunlightToSunTooltip: |- @@ -149,6 +157,7 @@ MatchSunlightToSunTooltip: |- Настройка делает так, чтобы направление света от солнца соответствовало его положению. MaxLights: "Макс. кол-во источников света" +MaxLightsValue: "Макс. кол-во источников света ({value, number, ::.00})" MaxLightsTooltip: "Значение по умолчанию: 8\nМаксимальное количество источников света для каждого объекта.\n\nНизкие числа (близкие к значению по умолчанию) приводят к резким перепадам освещения, как при устаревшем методе освещения." MenuHelpDelay: "Задержка всплывающих подсказок" MenuTransparency: "Прозрачность меню" @@ -199,6 +208,8 @@ TogglePostProcessorHUD: "Меню настроек постобработки" TransparencyFull: "Прозрачное" TransparencyNone: "Непрозрачное" ViewDistance: "Дальность обзора" +ViewDistanceValue: "Дальность обзора ({value, number, ::.00})" +ViewDistanceValueCells: "Дальность обзора (×{cells, number, ::.00})" Video: "Видео" VSync: "Вертикальная синхронизация" VSyncAdaptive: "Адаптивная" diff --git a/files/data/l10n/OMWEngine/sv.yaml b/files/data/l10n/OMWEngine/sv.yaml index bd2204ab09..23d26b72d8 100644 --- a/files/data/l10n/OMWEngine/sv.yaml +++ b/files/data/l10n/OMWEngine/sv.yaml @@ -65,7 +65,9 @@ SelectCharacter: "Välj spelfigur..." # Settings menu ActorsProcessingRange: "Processavstånd för figurer" +ActorsProcessingRangeValue: "Processavstånd för figurer ({value, number, :: group-off})" Anisotropy: "Anisotropi" +AnisotropyValue: "Anisotropi ({value})" Audio: "Ljud" AudioEffects: "Effekter" AudioFootsteps: "Fotsteg" @@ -98,12 +100,14 @@ DelayLow: "Snabbt" DelayHigh: "Långsamt" DetailLevel: "Detaljnivå" Difficulty: "Svårighetsgrad" +DifficultyValue: "Svårighetsgrad ({value})" DifficultyEasy: "Lätt" DifficultyHard: "Svårt" DistanceHigh: "Långt" #Unsure in what context this goes DistanceLow: "Nära" #Unsure in what context this goes EnableController: "Aktivera handkontroll" FieldOfView: "Synfält" +FieldOfViewValue: "Synfält ({value, number, ::.00})" FieldOfViewLow: "Låg" FieldOfViewHigh: "Hög" ForcePerPixelLighting: "Per-pixelljussättning" @@ -132,16 +136,20 @@ LightingMethodShadersCompatibility: "Shader (kompatibilitet)" LightingResetToDefaults: "Återställer till ursprungliga värden, vill du fortsätta? Ändringar till ljussättningsmetod kräver omstart." Lights: "Ljus" LightsBoundingSphereMultiplier: "Gränssfärsmultiplikator" +LightsBoundingSphereMultiplierValue: "Gränssfärsmultiplikator ({value, number, ::.00})" LightsBoundingSphereMultiplierTooltip: "Förvalt: 1.65\nMultiplikator för ljusens gränssfär.\nHögre värden ger mjukare minskning av gränssfären, men kräver högre värde i Max antal ljuskällor.\n\nPåverkar inte ljusstyrkan." LightsFadeStartMultiplier: "Blekningsstartmultiplikator" +LightsFadeStartMultiplierValue: "Blekningsstartmultiplikator ({value, number, ::.00})" LightsFadeStartMultiplierTooltip: "Förvalt: 0.85\nFraktion av det maximala avståndet från vilket ljuskällor börjar blekna.\n\nVälj lågt värde för långsammare övergång eller högre värde för snabbare övergång." LightsLightingMethodTooltip: "Välj intern hantering av ljuskällor.\n\n \"Gammaldags\" använder alltid max 8 ljuskällor per objekt och ger ljussättning likt ett gammaldags spel.\n\n \"Shader (kompatibilitet)\" tar bort begränsningen med max 8 ljuskällor per objekt. Detta läge aktiverar också ljus på marktäckning. Rekommenderas för äldre hårdvara tillsammans med en ljusbegränsning nära 8.\n\n \"Shader\" har alla fördelar som \"Shader (kompatibilitet)\" har, med med ett modernt förhållningssätt som möjliggör fler maximalt antal ljuskällor med liten eller ingen prestandaförlust på modern hårdvara." LightsMaximumDistance: "Maximalt ljusavstånd" +LightsMaximumDistanceValue: "Maximalt ljusavstånd ({value, number, :: group-off})" LightsMaximumDistanceTooltip: "Förvalt: 8192\nMaximala avståndet där ljuskällor syns (mätt i enheter).\n\nVärdet 0 ger oändligt avstånd." LightsMinimumInteriorBrightness: "Minsta ljusstyrka i interiörer" +LightsMinimumInteriorBrightness: "Minsta ljusstyrka i interiörer ({value, number, ::.00})" LightsMinimumInteriorBrightnessTooltip: "Förvalt: 0.08\nMinsta omgivande ljusstyrka i interiörer.\n\nÖka värdet om du anser att interiörer är för mörka.\n\nDetta har ingen effekt om klassiskt ljusavtagande används." MatchSunlightToSun: "Matcha solljus med solen" MatchSunlightToSunTooltip: |- @@ -150,6 +158,7 @@ MatchSunlightToSunTooltip: |- Detta alternativ gör att solljuskällans position matchar solens synliga position. MaxLights: "Max antal ljuskällor" +MaxLightsValue: "Max antal ljuskällor ({value, number, ::.00})" MaxLightsTooltip: "Förvalt: 8\nMaximalt antal ljuskällor per objekt.\n\nEtt lågt tal nära det förvalda kommer orsaka att ljuskällor poppar upp som vid ljussättningsmetoden Gammaldags." MenuHelpDelay: "Menyhjälp, fördröjning" #Unsure in what context this goes MenuTransparency: "Menytransparens" @@ -201,6 +210,8 @@ TransparencyFull: "Full" TransparencyNone: "Ingen" Video: "Bild" ViewDistance: "Siktavstånd" +ViewDistanceValue: "Siktavstånd ({value, number, ::.00})" +ViewDistanceValueCells: "Siktavstånd (×{cells, number, ::.00})" VSync: "VSynk" VSyncAdaptive: "Adaptiv" Water: "Vatten" diff --git a/files/data/mygui/openmw_settings_window.layout b/files/data/mygui/openmw_settings_window.layout index e6f42248dd..e2e20cd3a4 100644 --- a/files/data/mygui/openmw_settings_window.layout +++ b/files/data/mygui/openmw_settings_window.layout @@ -62,7 +62,7 @@ - + @@ -87,7 +87,7 @@ - + @@ -339,7 +339,7 @@ - + @@ -394,7 +394,7 @@ - + @@ -410,7 +410,7 @@ - + @@ -422,7 +422,7 @@ - + @@ -585,7 +585,7 @@ - + @@ -659,7 +659,7 @@ - + @@ -677,7 +677,7 @@ - + @@ -695,7 +695,7 @@ - + @@ -711,7 +711,7 @@ - + From 44c97786e5e4a750f5552aa1d8e48d38cbe406e7 Mon Sep 17 00:00:00 2001 From: Evil Eye Date: Tue, 9 Dec 2025 09:56:27 +0100 Subject: [PATCH 3/5] Fix interior brightness key --- files/data/l10n/OMWEngine/de.yaml | 2 +- files/data/l10n/OMWEngine/en.yaml | 2 +- files/data/l10n/OMWEngine/fr.yaml | 2 +- files/data/l10n/OMWEngine/pl.yaml | 2 +- files/data/l10n/OMWEngine/ru.yaml | 2 +- files/data/l10n/OMWEngine/sv.yaml | 2 +- files/data/mygui/openmw_settings_window.layout | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/files/data/l10n/OMWEngine/de.yaml b/files/data/l10n/OMWEngine/de.yaml index 618d22c28a..3bf38d723a 100644 --- a/files/data/l10n/OMWEngine/de.yaml +++ b/files/data/l10n/OMWEngine/de.yaml @@ -148,7 +148,7 @@ LightsMaximumDistance: "Maximale Lichtreichweite" LightsMaximumDistanceValue: "Maximale Lichtreichweite ({value, number, :: group-off})" LightsMaximumDistanceTooltip: "Standard: 8192 (1 Zelle)\nMaximale Entfernung, bis zu der Lichtquellen noch dargestellt werden (gemessen in In-Game-Einheiten).\n\nEin Wert von 0 entspricht einer unbegrenzten Reichweite." LightsMinimumInteriorBrightness: "Minimale Helligkeit in Innenräumen" -LightsMinimumInteriorBrightness: "Minimale Helligkeit in Innenräumen ({value, number, ::.00})" +LightsMinimumInteriorBrightnessValue: "Minimale Helligkeit in Innenräumen ({value, number, ::.00})" LightsMinimumInteriorBrightnessTooltip: "Standard: 0,08\nMinimale Umgebungshelligkeit in Innenräumen.\n\nKann erhöht werden, falls Innenräume zu dunkel dargestellt werden.\n\nDies hat keine Auswirkung, wenn der klassische Lichtabfall verwendet wird." MatchSunlightToSun: "Licht an Sonne ausrichten" MatchSunlightToSunTooltip: |- diff --git a/files/data/l10n/OMWEngine/en.yaml b/files/data/l10n/OMWEngine/en.yaml index d8407a3446..625e4e80ec 100644 --- a/files/data/l10n/OMWEngine/en.yaml +++ b/files/data/l10n/OMWEngine/en.yaml @@ -148,7 +148,7 @@ LightsMaximumDistance: "Maximum Light Distance" LightsMaximumDistanceValue: "Maximum Light Distance ({value, number, :: group-off})" LightsMaximumDistanceTooltip: "Default: 8192\nMaximum distance at which lights will appear (measured in units).\n\nSet this to 0 to use an unlimited distance." LightsMinimumInteriorBrightness: "Minimum Interior Brightness" -LightsMinimumInteriorBrightness: "Minimum Interior Brightness ({value, number, ::.00})" +LightsMinimumInteriorBrightnessValue: "Minimum Interior Brightness ({value, number, ::.00})" LightsMinimumInteriorBrightnessTooltip: "Default: 0.08\nMinimum ambient interior brightness.\n\nIncrease this if you feel interiors are too dark.\n\nThis has no effect if classic falloff is used." MatchSunlightToSun: "Match Sunlight to Sun" MatchSunlightToSunTooltip: |- diff --git a/files/data/l10n/OMWEngine/fr.yaml b/files/data/l10n/OMWEngine/fr.yaml index b00d7fca11..cf1f0a632d 100644 --- a/files/data/l10n/OMWEngine/fr.yaml +++ b/files/data/l10n/OMWEngine/fr.yaml @@ -148,7 +148,7 @@ LightsMaximumDistance: "Distance maximale des sources lumineuses" LightsMaximumDistanceValue: "Distance maximale des sources lumineuses ({value, number, :: group-off})" LightsMaximumDistanceTooltip: "valeur par défaut: 8192\nDistance maximale d'affichage des sources lumineuses (en unité de distance).\n\nMettez cette valeur à 0 pour une distance d'affichage infinie." LightsMinimumInteriorBrightness: "Luminosité intérieure minimale" -LightsMinimumInteriorBrightness: "Luminosité intérieure minimale ({value, number, ::.00})" +LightsMinimumInteriorBrightnessValue: "Luminosité intérieure minimale ({value, number, ::.00})" LightsMinimumInteriorBrightnessTooltip: "valeur par défaut: 0.08\nLuminosité ambiante minimum en intérieur.\n\nAugmentez cette valeur si les intérieurs vous semblent trop sombres.\n\nCela n'a aucun effet si l'atténuation classique est utilisée." MatchSunlightToSun: "Aligner la lumière du soleil" MatchSunlightToSunTooltip: |- diff --git a/files/data/l10n/OMWEngine/pl.yaml b/files/data/l10n/OMWEngine/pl.yaml index d21f298b74..567a7b04c5 100644 --- a/files/data/l10n/OMWEngine/pl.yaml +++ b/files/data/l10n/OMWEngine/pl.yaml @@ -148,7 +148,7 @@ LightsMaximumDistance: "Maksymalny zasięg światła" LightsMaximumDistanceValue: "Maksymalny zasięg światła ({value, number, :: group-off})" LightsMaximumDistanceTooltip: "Domyślnie: 8192\nMaksymalna odległość wyświetlania świateł (w jednostkach).\n\n0 = brak ograniczenia." LightsMinimumInteriorBrightness: "Minimalna jasność wnętrz" -LightsMinimumInteriorBrightness: "Minimalna jasność wnętrz ({value, number, ::.00})" +LightsMinimumInteriorBrightnessValue: "Minimalna jasność wnętrz ({value, number, ::.00})" LightsMinimumInteriorBrightnessTooltip: "Domyślnie: 0.08\nMinimalna jasność w pomieszczeniach.\n\nZwiększ to, jeśli wnętrza są zbyt ciemne.\n\nNie działa, gdy używana jest klasyczna metoda zanikania." MatchSunlightToSun: "Dopasuj światło słoneczne do pozycji słońca" MatchSunlightToSunTooltip: |- diff --git a/files/data/l10n/OMWEngine/ru.yaml b/files/data/l10n/OMWEngine/ru.yaml index 5b5a2dbd1a..f90be75e6e 100644 --- a/files/data/l10n/OMWEngine/ru.yaml +++ b/files/data/l10n/OMWEngine/ru.yaml @@ -148,7 +148,7 @@ LightsMaximumDistance: "Дальность отображения источни LightsMaximumDistanceValue: "Дальность отображения источников света ({value, number, :: group-off})" LightsMaximumDistanceTooltip: "Значение по умолчанию: 8192\nМаксимальное расстояние, на котором будут отображаться источники света (во внутриигровых единицах измерения).\n\nЕсли 0, то расстояние не ограничено." LightsMinimumInteriorBrightness: "Минимальный уровень освещения в помещениях" -LightsMinimumInteriorBrightness: "Минимальный уровень освещения в помещениях ({value, number, ::.00})" +LightsMinimumInteriorBrightnessValue: "Минимальный уровень освещения в помещениях ({value, number, ::.00})" LightsMinimumInteriorBrightnessTooltip: "Значение по умолчанию: 0.08\nМинимальный уровень фонового освещения в помещениях.\n\nУвеличьте значение, если помещения в игре кажутся слишком темными. Эта настройка не имеет эффекта, если используется классическое угасание." MatchSunlightToSun: "Свет солнца идет от солнца" MatchSunlightToSunTooltip: |- diff --git a/files/data/l10n/OMWEngine/sv.yaml b/files/data/l10n/OMWEngine/sv.yaml index 23d26b72d8..495ecef828 100644 --- a/files/data/l10n/OMWEngine/sv.yaml +++ b/files/data/l10n/OMWEngine/sv.yaml @@ -149,7 +149,7 @@ LightsMaximumDistance: "Maximalt ljusavstånd" LightsMaximumDistanceValue: "Maximalt ljusavstånd ({value, number, :: group-off})" LightsMaximumDistanceTooltip: "Förvalt: 8192\nMaximala avståndet där ljuskällor syns (mätt i enheter).\n\nVärdet 0 ger oändligt avstånd." LightsMinimumInteriorBrightness: "Minsta ljusstyrka i interiörer" -LightsMinimumInteriorBrightness: "Minsta ljusstyrka i interiörer ({value, number, ::.00})" +LightsMinimumInteriorBrightnessValue: "Minsta ljusstyrka i interiörer ({value, number, ::.00})" LightsMinimumInteriorBrightnessTooltip: "Förvalt: 0.08\nMinsta omgivande ljusstyrka i interiörer.\n\nÖka värdet om du anser att interiörer är för mörka.\n\nDetta har ingen effekt om klassiskt ljusavtagande används." MatchSunlightToSun: "Matcha solljus med solen" MatchSunlightToSunTooltip: |- diff --git a/files/data/mygui/openmw_settings_window.layout b/files/data/mygui/openmw_settings_window.layout index e2e20cd3a4..9d265ed6a3 100644 --- a/files/data/mygui/openmw_settings_window.layout +++ b/files/data/mygui/openmw_settings_window.layout @@ -711,7 +711,7 @@ - + From ea79cd76780dea0dc890ff84163898e27786c5b6 Mon Sep 17 00:00:00 2001 From: Evil Eye Date: Tue, 9 Dec 2025 18:22:24 +0100 Subject: [PATCH 4/5] Use namespace alias --- apps/openmw/mwgui/settingswindow.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/openmw/mwgui/settingswindow.cpp b/apps/openmw/mwgui/settingswindow.cpp index 6b73bd9f87..612e72152e 100644 --- a/apps/openmw/mwgui/settingswindow.cpp +++ b/apps/openmw/mwgui/settingswindow.cpp @@ -139,7 +139,7 @@ namespace } void updateSliderLabel(MyGUI::ScrollBar* scroller, MyGUI::TextBox* textBox, - const std::vector& argNames, const std::vector& args) + const std::vector& argNames, const std::vector& args) { if (textBox != nullptr) { @@ -174,8 +174,8 @@ namespace MWGui { MyGUI::ScrollBar* scroll = current->castType(); std::string_view valueType = getSettingValueType(current); - std::vector argNames; - std::vector args; + std::vector argNames; + std::vector args; if (valueType == "Float" || valueType == "Integer" || valueType == "Cell") { // TODO: ScrollBar isn't meant for this. should probably use a dedicated FloatSlider widget @@ -729,8 +729,8 @@ namespace MWGui { if (getSettingType(scroller) == "Slider") { - std::vector argNames; - std::vector args; + std::vector argNames; + std::vector args; std::string_view valueType = getSettingValueType(scroller); if (valueType == "Float" || valueType == "Integer" || valueType == "Cell") { From 350648079042449758911d740dcb82628bf52e68 Mon Sep 17 00:00:00 2001 From: Evil Eye Date: Sat, 13 Dec 2025 11:52:19 +0100 Subject: [PATCH 5/5] Properly escape apostrophes --- files/data/l10n/OMWEngine/de.yaml | 2 +- files/data/l10n/OMWEngine/en.yaml | 2 +- files/data/l10n/OMWEngine/fr.yaml | 2 +- files/data/l10n/OMWEngine/pl.yaml | 2 +- files/data/l10n/OMWEngine/ru.yaml | 2 +- files/data/l10n/OMWEngine/sv.yaml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/files/data/l10n/OMWEngine/de.yaml b/files/data/l10n/OMWEngine/de.yaml index 3bf38d723a..93bcd39d09 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 '{save}'. Soll er geladen werden?" +AskLoadLastSave: "Der aktuellste Spielstand ist ''{save}''. Soll er geladen werden?" BuildingNavigationMesh: "Erstelle Navigationsgitter..." InitializingData: "Initialisiere Daten..." LoadingExterior: "Lade Bereich..." diff --git a/files/data/l10n/OMWEngine/en.yaml b/files/data/l10n/OMWEngine/en.yaml index 625e4e80ec..83872d03b6 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 '{save}'. 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" diff --git a/files/data/l10n/OMWEngine/fr.yaml b/files/data/l10n/OMWEngine/fr.yaml index cf1f0a632d..561ad69d1a 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 '{save}'. 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" diff --git a/files/data/l10n/OMWEngine/pl.yaml b/files/data/l10n/OMWEngine/pl.yaml index 567a7b04c5..a56fa0b8ab 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 '{save}'. Czy chcesz go wczytać?" +AskLoadLastSave: "Ostatni zapis to ''{save}''. Czy chcesz go wczytać?" BuildingNavigationMesh: "Tworzenie siatki nawigacyjnej" InitializingData: "Inicjalizacja..." LoadingExterior: "Wczytywanie obszaru zewnętrznego" diff --git a/files/data/l10n/OMWEngine/ru.yaml b/files/data/l10n/OMWEngine/ru.yaml index f90be75e6e..49b7c42aba 100644 --- a/files/data/l10n/OMWEngine/ru.yaml +++ b/files/data/l10n/OMWEngine/ru.yaml @@ -12,7 +12,7 @@ PhysicsProfiler: "Профилировщик физики" # Messages -AskLoadLastSave: "Последнее сохранение - '{save}'. Загрузить?" +AskLoadLastSave: "Последнее сохранение - ''{save}''. Загрузить?" BuildingNavigationMesh: "Построение навигационной сетки" InitializingData: "Загрузка..." LoadingExterior: "Загрузка области" diff --git a/files/data/l10n/OMWEngine/sv.yaml b/files/data/l10n/OMWEngine/sv.yaml index 495ecef828..f90f939120 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 '{save}'. Vill du ladda den?" +AskLoadLastSave: "Den senaste sparfilen är ''{save}''. Vill du ladda den?" BuildingNavigationMesh: "Bygger navigeringsmesh" InitializingData: "Initialiserar data..." LoadingExterior: "Laddar område"