diff --git a/src/openrct2/localisation/LanguagePack.cpp b/src/openrct2/localisation/LanguagePack.cpp index a82707245a..bda03db897 100644 --- a/src/openrct2/localisation/LanguagePack.cpp +++ b/src/openrct2/localisation/LanguagePack.cpp @@ -9,6 +9,7 @@ #include "LanguagePack.h" +#include "../Context.h" #include "../common.h" #include "../core/FileStream.h" #include "../core/Memory.hpp" @@ -18,6 +19,7 @@ #include "../core/StringReader.h" #include "Language.h" #include "Localisation.h" +#include "LocalisationService.h" #include #include @@ -580,6 +582,12 @@ namespace LanguagePackFactory return languagePack; } + std::unique_ptr FromLanguageId(uint16_t id) + { + auto path = OpenRCT2::GetContext()->GetLocalisationService().GetLanguagePath(id); + return LanguagePack::FromFile(id, path.c_str()); + } + std::unique_ptr FromText(uint16_t id, const utf8* text) { auto languagePack = LanguagePack::FromText(id, text); diff --git a/src/openrct2/localisation/LanguagePack.h b/src/openrct2/localisation/LanguagePack.h index b6e63859ea..f5b8b9e8be 100644 --- a/src/openrct2/localisation/LanguagePack.h +++ b/src/openrct2/localisation/LanguagePack.h @@ -33,5 +33,6 @@ struct ILanguagePack namespace LanguagePackFactory { std::unique_ptr FromFile(uint16_t id, const utf8* path); + std::unique_ptr FromLanguageId(uint16_t id); std::unique_ptr FromText(uint16_t id, const utf8* text); } // namespace LanguagePackFactory diff --git a/src/openrct2/localisation/LocalisationService.cpp b/src/openrct2/localisation/LocalisationService.cpp index eee05c05e4..6716223312 100644 --- a/src/openrct2/localisation/LocalisationService.cpp +++ b/src/openrct2/localisation/LocalisationService.cpp @@ -11,6 +11,7 @@ #include "../Context.h" #include "../PlatformEnvironment.h" +#include "../core/Guard.hpp" #include "../core/Path.hpp" #include "../interface/Fonts.h" #include "../object/ObjectManager.h" @@ -94,9 +95,7 @@ void LocalisationService::OpenLanguage(int32_t id) throw std::invalid_argument("id was undefined"); } - std::string filename; - filename = GetLanguagePath(id); - auto preferredLanguage = LanguagePackFactory::FromFile(id, filename.c_str()); + auto preferredLanguage = LanguagePackFactory::FromLanguageId(id); if (preferredLanguage != nullptr) { _currentLanguage = id; @@ -110,31 +109,35 @@ void LocalisationService::OpenLanguage(int32_t id) } auto checkLanguage = LanguagesDescriptors[id].fallback; - while (true) + while (checkLanguage != LANGUAGE_UNDEFINED) { - if (checkLanguage == LANGUAGE_UNDEFINED) - break; - _languageOrder.emplace_back(checkLanguage); - filename = GetLanguagePath(checkLanguage); - _loadedLanguages.emplace_back(LanguagePackFactory::FromFile(checkLanguage, filename.c_str())); + auto fallbackLanguagePack = LanguagePackFactory::FromLanguageId(checkLanguage); + if (fallbackLanguagePack != nullptr) + { + _loadedLanguages.emplace_back(std::move(fallbackLanguagePack)); + } + checkLanguage = LanguagesDescriptors[checkLanguage].fallback; } if (id != LANGUAGE_ENGLISH_UK) { _languageOrder.emplace_back(LANGUAGE_ENGLISH_UK); - filename = GetLanguagePath(LANGUAGE_ENGLISH_UK); - _loadedLanguages.emplace_back(LanguagePackFactory::FromFile(LANGUAGE_ENGLISH_UK, filename.c_str())); + auto englishLanguagePack = LanguagePackFactory::FromLanguageId(LANGUAGE_ENGLISH_UK); + if (englishLanguagePack != nullptr) + { + _loadedLanguages.emplace_back(std::move(englishLanguagePack)); + } + else + { + throw std::runtime_error("Unable to open the English language file!"); + } } } void LocalisationService::CloseLanguages() { - for (auto& language : _loadedLanguages) - { - language = nullptr; - } _languageOrder.clear(); _loadedLanguages.clear(); _currentLanguage = LANGUAGE_UNDEFINED; @@ -143,6 +146,7 @@ void LocalisationService::CloseLanguages() std::tuple LocalisationService::GetLocalisedScenarioStrings( const std::string& scenarioFilename) const { + Guard::Assert(!_loadedLanguages.empty()); 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);