[Scummvm-git-logs] scummvm master -> 65fa2fa61b1d93bcc365b2324d31be2c19ef5f97
criezy
criezy at scummvm.org
Thu Feb 18 22:17:06 UTC 2021
This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
8e3376306a AGS: Use translation file from ConfMan if available
65fa2fa61b AGS: Add engine option widget to select language
Commit: 8e3376306aac45acfb8ac2943e4528719820dd74
https://github.com/scummvm/scummvm/commit/8e3376306aac45acfb8ac2943e4528719820dd74
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2021-02-18T22:17:03Z
Commit Message:
AGS: Use translation file from ConfMan if available
Changed paths:
engines/ags/engine/main/config.cpp
engines/ags/engine/platform/windows/setup/winsetup.cpp
diff --git a/engines/ags/engine/main/config.cpp b/engines/ags/engine/main/config.cpp
index b81713fc92..557ad42e7e 100644
--- a/engines/ags/engine/main/config.cpp
+++ b/engines/ags/engine/main/config.cpp
@@ -44,6 +44,7 @@
#include "ags/shared/util/string_utils.h"
#include "ags/engine/media/audio/audio_system.h"
#include "ags/engine/globals.h"
+#include "common/config-manager.h"
namespace AGS3 {
@@ -336,6 +337,7 @@ void override_config_ext(ConfigTree &cfg) {
INIwriteint(cfg, "misc", "antialias", _G(psp_gfx_smooth_sprites) != 0);
INIwritestring(cfg, "language", "translation", _G(psp_translation));
+
}
void apply_config(const ConfigTree &cfg) {
@@ -385,7 +387,11 @@ void apply_config(const ConfigTree &cfg) {
usetup.user_data_dir = INIreadstring(cfg, "misc", "user_data_dir");
usetup.shared_data_dir = INIreadstring(cfg, "misc", "shared_data_dir");
- usetup.translation = INIreadstring(cfg, "language", "translation");
+ Common::String translation;
+ if (ConfMan.getActiveDomain()->tryGetVal("translation", translation) && !translation.empty())
+ usetup.translation = translation;
+ else
+ usetup.translation = INIreadstring(cfg, "language", "translation");
int cache_size_kb = INIreadint(cfg, "misc", "cachemax", DEFAULTCACHESIZE_KB);
if (cache_size_kb > 0)
@@ -490,6 +496,14 @@ void save_config_file() {
cfg["mouse"]["speed"] = String::FromFormat("%f", Mouse::GetSpeed());
cfg["language"]["translation"] = usetup.translation;
+ if (usetup.translation.empty()) {
+ if (ConfMan.getActiveDomain()->contains("translation"))
+ ConfMan.getActiveDomain()->erase("translation");
+ } else
+ ConfMan.getActiveDomain()->setVal("translation", usetup.translation);
+
+ ConfMan.flushToDisk();
+
String cfg_file = find_user_cfg_file();
if (!cfg_file.IsEmpty())
IniUtil::Merge(cfg_file, cfg);
diff --git a/engines/ags/engine/platform/windows/setup/winsetup.cpp b/engines/ags/engine/platform/windows/setup/winsetup.cpp
index 27b3bea92a..cc88d145fc 100644
--- a/engines/ags/engine/platform/windows/setup/winsetup.cpp
+++ b/engines/ags/engine/platform/windows/setup/winsetup.cpp
@@ -181,7 +181,11 @@ void WinConfig::Load(const ConfigTree &cfg) {
MouseSpeed = 1.f;
SpriteCacheSize = INIreadint(cfg, "misc", "cachemax", SpriteCacheSize);
- Language = INIreadstring(cfg, "language", "translation", Language);
+
+ if (ConfMan.getActiveDomain()->tryGetVal("translation", translation) && !translation.empty())
+ Language = translation;
+ else
+ Language = INIreadstring(cfg, "language", "translation", Language);
DefaultLanguageName = INIreadstring(cfg, "language", "default_translation_name", DefaultLanguageName);
Title = INIreadstring(cfg, "misc", "titletext", Title);
@@ -211,6 +215,14 @@ void WinConfig::Save(ConfigTree &cfg) {
INIwriteint(cfg, "misc", "cachemax", SpriteCacheSize);
INIwritestring(cfg, "language", "translation", Language);
+
+ if (Language.empty()) {
+ if (ConfMan.getActiveDomain()->contains("translation"))
+ ConfMan.getActiveDomain()->erase("translation");
+ } else
+ ConfMan.getActiveDomain()->setVal("translation", Language);
+
+ ConfMan.flushToDisk();
}
Commit: 65fa2fa61b1d93bcc365b2324d31be2c19ef5f97
https://github.com/scummvm/scummvm/commit/65fa2fa61b1d93bcc365b2324d31be2c19ef5f97
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2021-02-18T22:17:03Z
Commit Message:
AGS: Add engine option widget to select language
AGS games can have multiple languages by providing
additional translations as .tra files. The language
selection is done by setting the config "translation"
key to the tra file name. This means that we cannot
easily use the standard ScummVM language selection
for this purpose as the tra file name may not map
to language names easily.
The approach in this commit does something similar
to the original games by detecting at runtime the
available tra files.
Changed paths:
engines/ags/detection.cpp
engines/ags/detection.h
diff --git a/engines/ags/detection.cpp b/engines/ags/detection.cpp
index 8f88109caa..c33b4c2023 100644
--- a/engines/ags/detection.cpp
+++ b/engines/ags/detection.cpp
@@ -24,9 +24,15 @@
#include "common/config-manager.h"
#include "common/file.h"
#include "common/md5.h"
+#include "common/str-array.h"
+#include "common/translation.h"
#include "ags/detection.h"
#include "ags/detection_tables.h"
+#include "gui/ThemeEval.h"
+#include "gui/widget.h"
+#include "gui/widgets/popup.h"
+
namespace AGS3 {
static const char *const HEAD_SIG = "CLIB\x1a";
@@ -58,6 +64,85 @@ static bool isAGSFile(Common::File &f) {
return false;
}
+class AGSOptionsWidget : public GUI::OptionsContainerWidget {
+public:
+ explicit AGSOptionsWidget(GuiObject *boss, const Common::String &name, const Common::String &domain);
+
+ // OptionsContainerWidget API
+ void load() override;
+ bool save() override;
+
+private:
+ // OptionsContainerWidget API
+ void defineLayout(GUI::ThemeEval &layouts, const Common::String &layoutName, const Common::String &overlayedLayout) const override;
+
+ GUI::PopUpWidget *_langPopUp;
+ Common::StringArray _traFileNames;
+};
+
+AGSOptionsWidget::AGSOptionsWidget(GuiObject *boss, const Common::String &name, const Common::String &domain) :
+ OptionsContainerWidget(boss, name, "AGSGameOptionsDialog", false, domain) {
+
+ GUI::StaticTextWidget *textWidget = new GUI::StaticTextWidget(widgetsBoss(), _dialogLayout + ".translation_desc", _("Game language:"), _("Language to use for multilingual games"));
+ textWidget->setAlign(Graphics::kTextAlignRight);
+
+ _langPopUp = new GUI::PopUpWidget(widgetsBoss(), _dialogLayout + ".translation");
+ _langPopUp->appendEntry(_("<default>"), (uint32)-1);
+
+ Common::String path = ConfMan.get("path", _domain);
+ Common::FSDirectory dir(path);
+ Common::ArchiveMemberList traFileList;
+ dir.listMatchingMembers(traFileList, "*.tra");
+
+ int i = 0;
+ for (Common::ArchiveMemberList::iterator iter = traFileList.begin(); iter != traFileList.end(); ++iter) {
+ Common::String traFileName = (*iter)->getName();
+ traFileName.erase(traFileName.size() - 4); // remove .tra extension
+ _traFileNames.push_back(traFileName);
+ _langPopUp->appendEntry(traFileName, i++);
+ }
+}
+
+void AGSOptionsWidget::defineLayout(GUI::ThemeEval &layouts, const Common::String &layoutName, const Common::String &overlayedLayout) const {
+ layouts.addDialog(layoutName, overlayedLayout);
+ layouts.addLayout(GUI::ThemeLayout::kLayoutVertical).addPadding(16, 16, 16, 16);
+
+ layouts.addLayout(GUI::ThemeLayout::kLayoutHorizontal).addPadding(0, 0, 0, 0);
+ layouts.addWidget("translation_desc", "OptionsLabel");
+ layouts.addWidget("translation", "PopUp").closeLayout();
+
+ layouts.closeLayout().closeDialog();
+}
+
+void AGSOptionsWidget::load() {
+ Common::ConfigManager::Domain *gameConfig = ConfMan.getDomain(_domain);
+ if (!gameConfig)
+ return;
+
+ uint32 curLangIndex = (uint32)-1;
+ Common::String curLang;
+ gameConfig->tryGetVal("translation", curLang);
+ if (!curLang.empty()) {
+ for (uint i = 0; i < _traFileNames.size(); ++i) {
+ if (_traFileNames[i].equalsIgnoreCase(curLang)) {
+ curLangIndex = i;
+ break;
+ }
+ }
+ }
+ _langPopUp->setSelectedTag(curLangIndex);
+}
+
+bool AGSOptionsWidget::save() {
+ uint langIndex = _langPopUp->getSelectedTag();
+ if (langIndex < _traFileNames.size())
+ ConfMan.set("translation", _traFileNames[langIndex], _domain);
+ else
+ ConfMan.removeKey("translation", _domain);
+
+ return true;
+}
+
} // namespace AGS3
AGSMetaEngineDetection::AGSMetaEngineDetection() : AdvancedMetaEngineDetection(AGS::GAME_DESCRIPTIONS,
@@ -133,4 +218,8 @@ ADDetectedGame AGSMetaEngineDetection::fallbackDetect(const FileMap &allFiles, c
return ADDetectedGame();
}
+GUI::OptionsContainerWidget *AGSMetaEngineDetection::buildEngineOptionsWidgetStatic(GUI::GuiObject *boss, const Common::String &name, const Common::String &target) const {
+ return new AGS3::AGSOptionsWidget(boss, name, target);
+}
+
REGISTER_PLUGIN_STATIC(AGS_DETECTION, PLUGIN_TYPE_ENGINE_DETECTION, AGSMetaEngineDetection);
diff --git a/engines/ags/detection.h b/engines/ags/detection.h
index 0a37e9ac0b..b461781bc6 100644
--- a/engines/ags/detection.h
+++ b/engines/ags/detection.h
@@ -69,6 +69,8 @@ public:
}
ADDetectedGame fallbackDetect(const FileMap &allFiles, const Common::FSList &fslist) const override;
+
+ GUI::OptionsContainerWidget *buildEngineOptionsWidgetStatic(GUI::GuiObject *boss, const Common::String &name, const Common::String &target) const override;
};
#endif
More information about the Scummvm-git-logs
mailing list