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/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..612e72152e 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/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..2d9944cc59 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" @@ -20,6 +23,8 @@ DetailLevel: "sDetail_Level" DifficultyEasy: "sEasy" DifficultyHard: "sHard" Difficulty: "sDifficulty" +DifficultyValue: + pattern: "{gmst:sDifficulty} ({value})" DistanceHigh: "sFar" DistanceLow: "sNear" EmptySaveNameError: "sNotifyMessage65" @@ -59,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 782ae50824..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 '%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 @@ -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" +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: |- @@ -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 4ec744ce80..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 '%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 @@ -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" +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: |- @@ -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 808d15b4d8..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 '%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 @@ -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" +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: |- @@ -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 58310954e2..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 '%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 @@ -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" +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: |- @@ -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 b780ba1e05..49b7c42aba 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 @@ -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: "Минимальный уровень освещения в помещениях" +LightsMinimumInteriorBrightnessValue: "Минимальный уровень освещения в помещениях ({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 c5ad166849..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 '%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 @@ -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" +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: |- @@ -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..9d265ed6a3 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 @@ - +