diff --git a/src/openrct2/localisation/LocalisationService.cpp b/src/openrct2/localisation/LocalisationService.cpp index cbb810202d..49baa93c46 100644 --- a/src/openrct2/localisation/LocalisationService.cpp +++ b/src/openrct2/localisation/LocalisationService.cpp @@ -40,10 +40,9 @@ LocalisationService::~LocalisationService() = default; const char* LocalisationService::GetString(StringId id) const { - const char* result = nullptr; if (id == STR_EMPTY) { - result = ""; + return ""; } else if (id >= BASE_OBJECT_STRING_ID && id < BASE_OBJECT_STRING_ID + MAX_OBJECT_CACHED_STRINGS) { @@ -53,24 +52,21 @@ const char* LocalisationService::GetString(StringId id) const return _objectStrings[index].c_str(); } - result = "(unallocated string)"; + return "(unallocated string)"; } else if (id != STR_NONE) { - if (_languageCurrent != nullptr) + for (const auto& language : _loadedLanguages) { - result = _languageCurrent->GetString(id); - } - if (result == nullptr && _languageFallback != nullptr) - { - result = _languageFallback->GetString(id); - } - if (result == nullptr) - { - result = "(undefined string)"; + const auto result = language->GetString(id); + if (result != nullptr) + return result; } + + return "(undefined string)"; } - return result; + + return nullptr; } std::string LocalisationService::GetLanguagePath(uint32_t languageId) const @@ -99,48 +95,52 @@ void LocalisationService::OpenLanguage(int32_t id) } std::string filename; - if (id != LANGUAGE_ENGLISH_UK) - { - filename = GetLanguagePath(LANGUAGE_ENGLISH_UK); - _languageFallback = LanguagePackFactory::FromFile(LANGUAGE_ENGLISH_UK, filename.c_str()); - } - filename = GetLanguagePath(id); - _languageCurrent = LanguagePackFactory::FromFile(id, filename.c_str()); - if (_languageCurrent != nullptr) + auto preferredLanguage = LanguagePackFactory::FromFile(id, filename.c_str()); + if (preferredLanguage != nullptr) { _currentLanguage = id; + _loadedLanguages.emplace_back(std::move(preferredLanguage)); TryLoadFonts(*this); } else { throw std::runtime_error("Unable to open language " + std::to_string(id)); } + + if (id != LANGUAGE_ENGLISH_UK) + { + filename = GetLanguagePath(LANGUAGE_ENGLISH_UK); + _loadedLanguages.emplace_back(LanguagePackFactory::FromFile(LANGUAGE_ENGLISH_UK, filename.c_str())); + } } void LocalisationService::CloseLanguages() { - _languageFallback = nullptr; - _languageCurrent = nullptr; + for (auto& language : _loadedLanguages) + { + language = nullptr; + } + _loadedLanguages.clear(); _currentLanguage = LANGUAGE_UNDEFINED; } std::tuple LocalisationService::GetLocalisedScenarioStrings( const std::string& scenarioFilename) const { - auto result0 = _languageCurrent->GetScenarioOverrideStringId(scenarioFilename.c_str(), 0); - auto result1 = _languageCurrent->GetScenarioOverrideStringId(scenarioFilename.c_str(), 1); - auto result2 = _languageCurrent->GetScenarioOverrideStringId(scenarioFilename.c_str(), 2); + auto result0 = _loadedLanguages[0]->GetScenarioOverrideStringId(scenarioFilename.c_str(), 0); + auto result1 = _loadedLanguages[0]->GetScenarioOverrideStringId(scenarioFilename.c_str(), 1); + auto result2 = _loadedLanguages[0]->GetScenarioOverrideStringId(scenarioFilename.c_str(), 2); return std::make_tuple(result0, result1, result2); } StringId LocalisationService::GetObjectOverrideStringId(std::string_view legacyIdentifier, uint8_t index) const { - if (_languageCurrent == nullptr) + if (_loadedLanguages.empty()) { return STR_NONE; } - return _languageCurrent->GetObjectOverrideStringId(legacyIdentifier, index); + return _loadedLanguages[0]->GetObjectOverrideStringId(legacyIdentifier, index); } StringId LocalisationService::AllocateObjectString(const std::string& target) diff --git a/src/openrct2/localisation/LocalisationService.h b/src/openrct2/localisation/LocalisationService.h index 30cf879d28..2e45964459 100644 --- a/src/openrct2/localisation/LocalisationService.h +++ b/src/openrct2/localisation/LocalisationService.h @@ -34,8 +34,7 @@ namespace OpenRCT2::Localisation const std::shared_ptr _env; int32_t _currentLanguage{}; bool _useTrueTypeFont{}; - std::unique_ptr _languageFallback; - std::unique_ptr _languageCurrent; + std::vector> _loadedLanguages; std::stack _availableObjectStringIds; std::vector _objectStrings;