mirror of https://github.com/OpenRCT2/OpenRCT2.git
Close #18945: Allow languages to fall back to more than just en-GB
This commit is contained in:
parent
94b8928dcd
commit
08270d7d31
|
@ -5,6 +5,7 @@
|
|||
- Feature: [#18744] Cheat to allow using a regular path as a queue path.
|
||||
- Improved: [#18749] Ability to have 4 active awards for more than one month in a row.
|
||||
- Improved: [#18826] [Plugin] Added all actions and their documentation to plugin API.
|
||||
- Improved: [#18945] Languages can now fall back to other languages than English.
|
||||
- Fix: [#18467] “Selected only” Object Selection filter is active in Track Designs Manager, and cannot be toggled.
|
||||
- Fix: [#18905] Ride Construction window theme is not applied correctly.
|
||||
- Fix: [#18911] Mini Golf station does not draw correctly from all angles.
|
||||
|
|
|
@ -23,32 +23,32 @@
|
|||
// clang-format off
|
||||
const language_descriptor LanguagesDescriptors[LANGUAGE_COUNT] =
|
||||
{
|
||||
{ "", "", "", FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_UNDEFINED
|
||||
{ "ar-EG", "Arabic (experimental)", "Arabic (experimental)", FAMILY(&TTFFamilySansSerif), true }, // LANGUAGE_ARABIC
|
||||
{ "ca-ES", "Catalan", u8"Català", FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_CATALAN
|
||||
{ "zh-CN", "Chinese (Simplified)", "Chinese (Simplified)", FAMILY(&TTFFamilyChineseSimplified), false }, // LANGUAGE_CHINESE_SIMPLIFIED
|
||||
{ "zh-TW", "Chinese (Traditional)", "Chinese (Traditional)", FAMILY(&TTFFamilyChineseTraditional), false }, // LANGUAGE_CHINESE_TRADITIONAL
|
||||
{ "cs-CZ", "Czech", u8"Čeština", FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_CZECH
|
||||
{ "da-DK", "Danish", "Dansk", FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_DANISH
|
||||
{ "de-DE", "German", "Deutsch", FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_GERMAN
|
||||
{ "en-GB", "English (UK)", "English (UK)", FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_ENGLISH_UK
|
||||
{ "en-US", "English (US)", "English (US)", FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_ENGLISH_US
|
||||
{ "eo-ZZ", "Esperanto", "Esperanto", FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_ESPERANTO
|
||||
{ "es-ES", "Spanish", u8"Español", FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_SPANISH
|
||||
{ "fr-FR", "French", u8"Français", FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_FRENCH
|
||||
{ "it-IT", "Italian", "Italiano", FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_ITALIAN
|
||||
{ "ja-JP", "Japanese", "Japanese", FAMILY(&TTFFamilyJapanese), false }, // LANGUAGE_JAPANESE
|
||||
{ "ko-KR", "Korean", "Korean", FAMILY(&TTFFamilyKorean), false }, // LANGUAGE_KOREAN
|
||||
{ "hu-HU", "Hungarian", "Magyar", FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_HUNGARIAN
|
||||
{ "nl-NL", "Dutch", "Nederlands", FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_DUTCH
|
||||
{ "nb-NO", "Norwegian", "Norsk", FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_NORWEGIAN
|
||||
{ "pl-PL", "Polish", "Polski", FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_POLISH
|
||||
{ "pt-BR", "Portuguese (BR)", u8"Português (BR)", FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_PORTUGUESE_BR
|
||||
{ "ru-RU", "Russian", u8"Русский", FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_RUSSIAN
|
||||
{ "fi-FI", "Finnish", "Suomi", FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_FINNISH
|
||||
{ "sv-SE", "Swedish", "Svenska", FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_SWEDISH
|
||||
{ "tr-TR", "Turkish", "Türkçe", FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_TURKISH
|
||||
{ "vi-VN", "Vietnamese", "Vietnamese", FAMILY(&TTFFamilySansSerif), false }, // LANGUAGE_VIETNAMESE
|
||||
{ "", "", "", LANGUAGE_UNDEFINED, FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_UNDEFINED
|
||||
{ "ar-EG", "Arabic (experimental)", "Arabic (experimental)", LANGUAGE_UNDEFINED, FAMILY(&TTFFamilySansSerif), true }, // LANGUAGE_ARABIC
|
||||
{ "ca-ES", "Catalan", u8"Català", LANGUAGE_UNDEFINED, FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_CATALAN
|
||||
{ "zh-CN", "Chinese (Simplified)", "Chinese (Simplified)", LANGUAGE_UNDEFINED, FAMILY(&TTFFamilyChineseSimplified), false }, // LANGUAGE_CHINESE_SIMPLIFIED
|
||||
{ "zh-TW", "Chinese (Traditional)", "Chinese (Traditional)", LANGUAGE_UNDEFINED, FAMILY(&TTFFamilyChineseTraditional), false }, // LANGUAGE_CHINESE_TRADITIONAL
|
||||
{ "cs-CZ", "Czech", u8"Čeština", LANGUAGE_UNDEFINED, FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_CZECH
|
||||
{ "da-DK", "Danish", "Dansk", LANGUAGE_UNDEFINED, FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_DANISH
|
||||
{ "de-DE", "German", "Deutsch", LANGUAGE_UNDEFINED, FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_GERMAN
|
||||
{ "en-GB", "English (UK)", "English (UK)", LANGUAGE_UNDEFINED, FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_ENGLISH_UK
|
||||
{ "en-US", "English (US)", "English (US)", LANGUAGE_UNDEFINED, FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_ENGLISH_US
|
||||
{ "eo-ZZ", "Esperanto", "Esperanto", LANGUAGE_UNDEFINED, FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_ESPERANTO
|
||||
{ "es-ES", "Spanish", u8"Español", LANGUAGE_UNDEFINED, FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_SPANISH
|
||||
{ "fr-FR", "French", u8"Français", LANGUAGE_UNDEFINED, FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_FRENCH
|
||||
{ "it-IT", "Italian", "Italiano", LANGUAGE_UNDEFINED, FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_ITALIAN
|
||||
{ "ja-JP", "Japanese", "Japanese", LANGUAGE_UNDEFINED, FAMILY(&TTFFamilyJapanese), false }, // LANGUAGE_JAPANESE
|
||||
{ "ko-KR", "Korean", "Korean", LANGUAGE_UNDEFINED, FAMILY(&TTFFamilyKorean), false }, // LANGUAGE_KOREAN
|
||||
{ "hu-HU", "Hungarian", "Magyar", LANGUAGE_UNDEFINED, FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_HUNGARIAN
|
||||
{ "nl-NL", "Dutch", "Nederlands", LANGUAGE_UNDEFINED, FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_DUTCH
|
||||
{ "nb-NO", "Norwegian", "Norsk", LANGUAGE_UNDEFINED, FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_NORWEGIAN
|
||||
{ "pl-PL", "Polish", "Polski", LANGUAGE_UNDEFINED, FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_POLISH
|
||||
{ "pt-BR", "Portuguese (BR)", u8"Português (BR)", LANGUAGE_UNDEFINED, FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_PORTUGUESE_BR
|
||||
{ "ru-RU", "Russian", u8"Русский", LANGUAGE_UNDEFINED, FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_RUSSIAN
|
||||
{ "fi-FI", "Finnish", "Suomi", LANGUAGE_UNDEFINED, FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_FINNISH
|
||||
{ "sv-SE", "Swedish", "Svenska", LANGUAGE_UNDEFINED, FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_SWEDISH
|
||||
{ "tr-TR", "Turkish", "Türkçe", LANGUAGE_UNDEFINED, FAMILY_OPENRCT2_SPRITE, false }, // LANGUAGE_TURKISH
|
||||
{ "vi-VN", "Vietnamese", "Vietnamese", LANGUAGE_UNDEFINED, FAMILY(&TTFFamilySansSerif), false }, // LANGUAGE_VIETNAMESE
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
|
|
|
@ -75,6 +75,7 @@ struct language_descriptor
|
|||
const char* locale;
|
||||
const utf8* english_name;
|
||||
const utf8* native_name;
|
||||
uint8_t fallback;
|
||||
#if !defined(NO_TTF)
|
||||
TTFontFamily const* font_family;
|
||||
#else
|
||||
|
|
|
@ -108,6 +108,13 @@ void LocalisationService::OpenLanguage(int32_t id)
|
|||
throw std::runtime_error("Unable to open language " + std::to_string(id));
|
||||
}
|
||||
|
||||
const auto fallback = LanguagesDescriptors[id].fallback;
|
||||
if (fallback != LANGUAGE_UNDEFINED)
|
||||
{
|
||||
filename = GetLanguagePath(fallback);
|
||||
_loadedLanguages.emplace_back(LanguagePackFactory::FromFile(fallback, filename.c_str()));
|
||||
}
|
||||
|
||||
if (id != LANGUAGE_ENGLISH_UK)
|
||||
{
|
||||
filename = GetLanguagePath(LANGUAGE_ENGLISH_UK);
|
||||
|
|
|
@ -155,34 +155,46 @@ void StringTable::SetString(ObjectStringID id, uint8_t language, const std::stri
|
|||
void StringTable::Sort()
|
||||
{
|
||||
auto targetLanguage = LocalisationService_GetCurrentLanguage();
|
||||
std::sort(_strings.begin(), _strings.end(), [targetLanguage](const StringTableEntry& a, const StringTableEntry& b) -> bool {
|
||||
if (a.Id == b.Id)
|
||||
{
|
||||
if (a.LanguageId == b.LanguageId)
|
||||
auto fallbackLanguage = LanguagesDescriptors[targetLanguage].fallback;
|
||||
std::sort(
|
||||
_strings.begin(), _strings.end(),
|
||||
[targetLanguage, fallbackLanguage](const StringTableEntry& a, const StringTableEntry& b) -> bool {
|
||||
if (a.Id == b.Id)
|
||||
{
|
||||
return String::Compare(a.Text, b.Text, true) < 0;
|
||||
}
|
||||
if (a.LanguageId == b.LanguageId)
|
||||
{
|
||||
return String::Compare(a.Text, b.Text, true) < 0;
|
||||
}
|
||||
|
||||
if (a.LanguageId == targetLanguage)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if (b.LanguageId == targetLanguage)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (a.LanguageId == targetLanguage)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if (b.LanguageId == targetLanguage)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (a.LanguageId == LANGUAGE_ENGLISH_UK)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if (b.LanguageId == LANGUAGE_ENGLISH_UK)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (fallbackLanguage != LANGUAGE_UNDEFINED)
|
||||
{
|
||||
if (a.LanguageId == fallbackLanguage)
|
||||
return true;
|
||||
|
||||
return a.LanguageId < b.LanguageId;
|
||||
}
|
||||
return a.Id < b.Id;
|
||||
});
|
||||
if (b.LanguageId == fallbackLanguage)
|
||||
return false;
|
||||
}
|
||||
|
||||
if (a.LanguageId == LANGUAGE_ENGLISH_UK)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if (b.LanguageId == LANGUAGE_ENGLISH_UK)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return a.LanguageId < b.LanguageId;
|
||||
}
|
||||
return a.Id < b.Id;
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue