1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-16 11:33:03 +01:00

Change loaded languages to a vector

This commit is contained in:
Gymnasiast
2023-01-02 21:17:04 +01:00
parent 2e27f63f08
commit 94b8928dcd
2 changed files with 30 additions and 31 deletions

View File

@@ -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<StringId, StringId, StringId> 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)

View File

@@ -34,8 +34,7 @@ namespace OpenRCT2::Localisation
const std::shared_ptr<IPlatformEnvironment> _env;
int32_t _currentLanguage{};
bool _useTrueTypeFont{};
std::unique_ptr<ILanguagePack> _languageFallback;
std::unique_ptr<ILanguagePack> _languageCurrent;
std::vector<std::unique_ptr<ILanguagePack>> _loadedLanguages;
std::stack<StringId> _availableObjectStringIds;
std::vector<std::string> _objectStrings;