Merge branch 'l10n' into 'master'

Make configurable whether GMST strings have priority over built-in interface messages

See merge request OpenMW/openmw!3134
revert-6246b479
psi29a 2 years ago
commit 47b1247fa2

@ -671,7 +671,8 @@ void OMW::Engine::prepareEngine()
mViewer->addEventHandler(mScreenCaptureHandler);
mL10nManager = std::make_unique<l10n::Manager>(mVFS.get());
mL10nManager->setPreferredLocales(Settings::Manager::getStringArray("preferred locales", "General"));
mL10nManager->setPreferredLocales(Settings::Manager::getStringArray("preferred locales", "General"),
Settings::Manager::getBool("gmst overrides l10n", "General"));
mEnvironment.setL10nManager(*mL10nManager);
mLuaManager = std::make_unique<MWLua::LuaManager>(mVFS.get(), mResDir / "lua_libs");

@ -274,6 +274,7 @@ namespace MWGui
getWidget(mWaterRainRippleDetail, "WaterRainRippleDetail");
getWidget(mPrimaryLanguage, "PrimaryLanguage");
getWidget(mSecondaryLanguage, "SecondaryLanguage");
getWidget(mGmstOverridesL10n, "GmstOverridesL10nButton");
getWidget(mWindowModeHint, "WindowModeHint");
getWidget(mLightingMethodButton, "LightingMethodButton");
getWidget(mLightsResetButton, "LightsResetButton");
@ -332,6 +333,8 @@ namespace MWGui
+= MyGUI::newDelegate(this, &SettingsWindow::onPrimaryLanguageChanged);
mSecondaryLanguage->eventComboChangePosition
+= MyGUI::newDelegate(this, &SettingsWindow::onSecondaryLanguageChanged);
mGmstOverridesL10n->eventMouseButtonClick
+= MyGUI::newDelegate(this, &SettingsWindow::onGmstOverridesL10nChanged);
computeMinimumWindowSize();
@ -403,6 +406,8 @@ namespace MWGui
if (Misc::getFileExtension(path) == "yaml")
{
std::string localeName(Misc::stemFile(path));
if (localeName == "gmst")
continue; // fake locale to get gmst strings from content files
if (std::find(availableLanguages.begin(), availableLanguages.end(), localeName)
== availableLanguages.end())
availableLanguages.push_back(localeName);
@ -571,6 +576,12 @@ namespace MWGui
Settings::Manager::setStringArray("preferred locales", "General", currentLocales);
}
void SettingsWindow::onGmstOverridesL10nChanged(MyGUI::Widget*)
{
MWBase::Environment::get().getWindowManager()->interactiveMessageBox(
"#{OMWEngine:ChangeRequiresRestart}", { "#{Interface:OK}" }, true);
}
void SettingsWindow::onVSyncModeChanged(MyGUI::ComboBox* _sender, size_t pos)
{
if (pos == MyGUI::ITEM_NONE)

@ -45,6 +45,7 @@ namespace MWGui
MyGUI::ComboBox* mPrimaryLanguage;
MyGUI::ComboBox* mSecondaryLanguage;
MyGUI::Button* mGmstOverridesL10n;
MyGUI::Widget* mWindowModeHint;
@ -84,6 +85,7 @@ namespace MWGui
void onPrimaryLanguageChanged(MyGUI::ComboBox* _sender, size_t pos) { onLanguageChanged(0, _sender, pos); }
void onSecondaryLanguageChanged(MyGUI::ComboBox* _sender, size_t pos) { onLanguageChanged(1, _sender, pos); }
void onLanguageChanged(size_t langPriority, MyGUI::ComboBox* _sender, size_t pos);
void onGmstOverridesL10nChanged(MyGUI::Widget* _sender);
void onWindowModeChanged(MyGUI::ComboBox* _sender, size_t pos);
void onVSyncModeChanged(MyGUI::ComboBox* _sender, size_t pos);

@ -9,10 +9,11 @@
namespace l10n
{
void Manager::setPreferredLocales(const std::vector<std::string>& langs)
void Manager::setPreferredLocales(const std::vector<std::string>& langs, bool gmstHasPriority)
{
mPreferredLocales.clear();
mPreferredLocales.push_back(icu::Locale("gmst"));
if (gmstHasPriority)
mPreferredLocales.push_back(icu::Locale("gmst"));
std::set<std::string> langSet;
for (const auto& lang : langs)
{
@ -21,6 +22,8 @@ namespace l10n
langSet.insert(lang);
mPreferredLocales.push_back(icu::Locale(lang.c_str()));
}
if (!gmstHasPriority)
mPreferredLocales.push_back(icu::Locale("gmst"));
{
Log msg(Debug::Info);
msg << "Preferred locales:";

@ -22,7 +22,7 @@ namespace l10n
}
void dropCache() { mCache.clear(); }
void setPreferredLocales(const std::vector<std::string>& locales);
void setPreferredLocales(const std::vector<std::string>& locales, bool gmstHasPriority = true);
const std::vector<icu::Locale>& getPreferredLocales() const { return mPreferredLocales; }
void setGmstLoader(std::function<std::string(std::string_view)> fn) { mGmstLoader = std::move(fn); }

@ -29,6 +29,7 @@ namespace Settings
makeEnumSanitizerString({ "none", "nearest", "linear" }) };
SettingValue<bool> mNotifyOnSavedScreenshot{ mIndex, "General", "notify on saved screenshot" };
SettingValue<std::string> mPreferredLocales{ mIndex, "General", "preferred locales" };
SettingValue<bool> mGmstOverridesL10n{ mIndex, "General", "gmst overrides l10n" };
SettingValue<std::size_t> mLogBufferSize{ mIndex, "General", "log buffer size" };
SettingValue<std::size_t> mConsoleHistoryBufferSize{ mIndex, "General", "console history buffer size" };
};

@ -87,6 +87,19 @@ refer to any of the country-specific variants.
Two highest priority locales may be assigned via the Localization tab of the in-game options.
gmst overrides l10n
-------------------
:Type: boolean
:Range: True/False
:Default: True
If true, localization GMSTs in content have priority over l10n files.
Setting to false can be useful if selected preferred locale doesn't
match the language of content files.
Can be changed via the Localization tab of the in-game options.
log buffer size
---------------

@ -140,6 +140,7 @@ WindowModeWindowedFullscreen: "Fenster Vollbild"
#GammaCorrection: "Gamma Correction"
#GammaDark: "Dark"
#GammaLight: "Light"
#GmstOverridesL10n: "Strings from ESM files have priority"
#InvertYAxis: "Invert Y Axis"
#MenuHelpDelay: "Menu Help Delay"
#MenuTransparency: "Menu Transparency"

@ -77,6 +77,7 @@ FrameRateHint: "Hint: press F3 to show\nthe current frame rate."
GammaCorrection: "Gamma Correction"
GammaDark: "Dark"
GammaLight: "Light"
GmstOverridesL10n: "Strings from ESM files have priority"
InvertXAxis: "Invert X Axis"
InvertYAxis: "Invert Y Axis"
Language: "Language"

@ -48,22 +48,46 @@ OverwriteGameConfirmation: "Écraser la sauvegarde précédente ?"
ActorsProcessingRange: "Distance de traitement pour les personnages"
Anisotropy: "Anisotropie"
Audio: "Audio"
AudioEffects: "Ambiance"
AudioFootsteps: "Bruits de pas"
AudioMaster: "Général"
AudioMusic: "Musique"
AudioVoice: "Voix"
CameraSensitivity: "Sensibilité de la caméra"
CameraZoomIn: "Zoom avant de la caméra"
CameraZoomOut: "Zoom arrière de la caméra"
ChangeRequiresRestart: "Ce changement requiert un redémarrage de l'application pour prendre effet."
ConfirmResetBindings: "Réinitialiser tous les contrôles à leurs valeurs par défaut ?"
ConfirmResolution: "La nouvelle résolution d'affichage sera appliquée instantanément. Voulez-vous continuer ?"
Controller: "Manette"
Controls: "Contrôles"
DelayHigh: "Lent"
DelayLow: "Rapide"
DetailLevel: "Niveau de détails"
Difficulty: "Difficulté"
DifficultyEasy: "Facile"
DifficultyHard: "Difficile"
DistanceHigh: "Lointain"
DistanceLow: "Proche"
EnableController: "Activer la manette"
FieldOfView: "Champ de vision"
FieldOfViewHigh: "Étendu"
FieldOfViewLow: "Restreint"
FrameRateHint: "Note: Appuyez sur F3 pour afficher la fréquence d'affichage (FPS)."
GammaCorrection: "Correction Gamma"
GammaDark: "Sombre"
GammaLight: "Clair"
GmstOverridesL10n: "Les chaînes de caractères des fichiers ESM sont prioritaires"
InvertXAxis: "Inverser l'axe X"
InvertYAxis: "Inverser l'axe Y"
Language: "Localisation"
LanguageNote: "Note: Ce paramètre n'affecte pas les textes des fichiers ESM."
LightingMethod: "Méthode d'affichage des lumières"
LightingMethodLegacy: "Traditionnelle"
LightingMethodShaders: "Shaders"
LightingMethod: "Méthode d'affichage des lumières"
LightingMethodShadersCompatibility: "Shaders (mode de compatibilité)"
LightingMethodShaders: "Shaders"
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"
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"
@ -72,86 +96,63 @@ LightsMaximumDistance: "Distance maximale des sources lumineuses"
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"
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."
Lights: "Sources lumineuses"
MaxLights: "Maximum de sources lumineuses"
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"
MouseAndKeyboard: "Souris/Clavier"
PostProcessingIsNotEnabled: "Le post-traitement est désactivé"
PostProcessing: "Post-traitement"
PostProcessingTooltip: "Modifiable dans le HUD de post-traitement, accessible à partir les paramètres de contrôle."
Preferences: "Préférences"
PrimaryLanguage: "Localisation principale"
PrimaryLanguageTooltip: "Les fichiers de localisation associés à cette langue sont prioritaires."
RainRippleDetail: "Détails pour les ondes de pluie"
QualityHigh: "Haute"
QualityLow: "Basse"
QualityMedium: "Moyenne"
RainRippleDetailDense: "Denses"
RainRippleDetail: "Détails pour les ondes de pluie"
RainRippleDetailSimple: "Simples"
RainRippleDetailSparse: "Éparses"
ReflectionShaderDetail: "Niveau de détail du shader de réflexion"
RebindAction: "Appuyez sur une touche pour l'associer à cette action"
ReflectionShaderDetailActors: "Acteurs"
ReflectionShaderDetailGroundcover: "Couverture végétale"
ReflectionShaderDetail: "Niveau de détail du shader de réflexion"
ReflectionShaderDetailObjects: "Objets"
ReflectionShaderDetailSky: "Ciel"
ReflectionShaderDetailTerrain: "Terrain"
ReflectionShaderDetailWorld: "Monde"
Refraction: "Réfraction"
ResetControls: "Réinitialiser les contrôles"
Screenshot: "Capture d'écran"
Scripts: "Scripts"
ScriptsDisabled: "Chargez une sauvegarde pour accéder aux paramètres des scripts."
Scripts: "Scripts"
SecondaryLanguage: "Localisation secondaire"
SecondaryLanguageTooltip: "Localisation utilisée si le texte est absent de la localisation principale."
TextureFiltering: "Filtre appliqué aux textures"
SensitivityHigh: "Haute"
SensitivityLow: "Faible"
SettingsWindow: "Options"
Subtitles: "Sous-titres"
TestingExteriorCells: "Vérification des espaces (cells) extérieurs"
TestingInteriorCells: "Vérification des espaces (cells) intérieurs"
TextureFilteringBilinear: "Bilinéaire"
TextureFilteringDisabled: "Aucun"
TextureFiltering: "Filtre appliqué aux textures"
TextureFilteringOther: "Autre"
TextureFilteringTrilinear: "Trilinéaire"
ToggleHUD: "Afficher/masquer le HUD"
TogglePostProcessorHUD: "Afficher/masquer le HUD de post-traitement"
TransparencyFull: "Haute"
TransparencyNone: "Basse"
Video: "Graphisme"
ViewDistance: "Distance d'affichage"
VSync: "VSync"
Water: "Eau"
WaterShader: "Shader pour l'eau"
WaterShaderTextureQuality: "Qualité des textures"
WindowBorder: "Bordure de fenêtre"
WindowMode: "Mode d'affichage"
WindowModeFullscreen: "Plein écran"
WindowMode: "Mode d'affichage"
WindowModeWindowed: "Fenêtré"
WindowModeWindowedFullscreen: "Fenêtré plein écran"
Audio: "Audio"
AudioMaster: "Général"
AudioVoice: "Voix"
AudioEffects: "Ambiance"
AudioFootsteps: "Bruits de pas"
AudioMusic: "Musique"
ConfirmResetBindings: "Réinitialiser tous les contrôles à leurs valeurs par défaut ?"
ConfirmResolution: "La nouvelle résolution d'affichage sera appliquée instantanément. Voulez-vous continuer ?"
Controls: "Contrôles"
DelayLow: "Rapide"
DelayHigh: "Lent"
DetailLevel: "Niveau de détails"
Difficulty: "Difficulté"
DifficultyEasy: "Facile"
DifficultyHard: "Difficile"
DistanceHigh: "Lointain"
DistanceLow: "Proche"
EnableController: "Activer la manette"
FieldOfViewLow: "Restreint"
FieldOfViewHigh: "Étendu"
GammaCorrection: "Correction Gamma"
GammaDark: "Sombre"
GammaLight: "Clair"
InvertYAxis: "Inverser l'axe Y"
MenuHelpDelay: "Délai d'affichage du menu d'aide"
MenuTransparency: "Transparence des menus"
TransparencyFull: "Haute"
TransparencyNone: "Basse"
Preferences: "Préférences"
PostProcessingIsNotEnabled: "Le post-traitement est désactivé"
QualityHigh: "Haute"
QualityLow: "Basse"
QualityMedium: "Moyenne"
RebindAction: "Appuyez sur une touche pour l'associer à cette action"
ResetControls: "Réinitialiser les contrôles"
SensitivityHigh: "Haute"
SensitivityLow: "Faible"
SettingsWindow: "Options"
Subtitles: "Sous-titres"
TestingExteriorCells: "Vérification des espaces (cells) extérieurs"
TestingInteriorCells: "Vérification des espaces (cells) intérieurs"
Video: "Graphisme"
ViewDistance: "Distance d'affichage"

@ -77,6 +77,7 @@ FrameRateHint: "Подсказка: нажмите F3, чтобы показат
GammaCorrection: "Гамма-коррекция"
GammaDark: "Темно"
GammaLight: "Светло"
GmstOverridesL10n: "Строки из ESM-файлов имеют максимальный приоритет"
InvertXAxis: "Инвертировать ось X"
InvertYAxis: "Инвертировать ось Y"
Language: "Язык"

@ -143,6 +143,7 @@ WindowModeWindowedFullscreen: "Fullskärm i fönsterläge"
#GammaCorrection: "Gamma Correction"
#GammaDark: "Dark"
#GammaLight: "Light"
#GmstOverridesL10n: "Strings from ESM files have priority"
#InvertYAxis: "Invert Y Axis"
#MenuHelpDelay: "Menu Help Delay"
#MenuTransparency: "Menu Transparency"

@ -701,6 +701,16 @@
<UserString key="Caption_Text" value="#{OMWEngine:SecondaryLanguageTooltip}"/>
</Widget>
<Widget type="ComboBox" skin="MW_ComboBox" position="262 52 250 24" align="Left Top" name="SecondaryLanguage" />
<Widget type="HBox" position="4 84 500 32">
<Widget type="AutoSizedButton" skin="MW_Button" name="GmstOverridesL10nButton">
<UserString key="SettingCategory" value="General"/>
<UserString key="SettingName" value="gmst overrides l10n"/>
<UserString key="SettingType" value="CheckButton"/>
</Widget>
<Widget type="AutoSizedTextBox" skin="SandText">
<Property key="Caption" value="#{OMWEngine:GmstOverridesL10n} "/>
</Widget>
</Widget>
</Widget>
</Widget>
<Widget type="AutoSizedButton" skin="MW_Button" position="320 420 56 24" align="Right Bottom" name="OkButton">

@ -393,6 +393,9 @@ notify on saved screenshot = false
# For example "de,en" means German as the first prority and English as a fallback.
preferred locales = en
# If true then l10n/*/gmst.yaml has priority over other l10n files.
gmst overrides l10n = true
# Buffer size for the in-game log viewer (press F10 to toggle). Zero disables the log viewer.
log buffer size = 65536

Loading…
Cancel
Save