Browse Source

Restore fallback for non-regional translation

Also adds an explicit check for en given this the base translation for the application and will never have a .mo/.gmo file.
pull/1524/head
ephphatha 4 years ago committed by Anders Jenbo
parent
commit
c0ec4a845a
  1. 19
      Source/options.cpp
  2. 14
      Source/utils/language.cpp

19
Source/options.cpp

@ -997,6 +997,25 @@ void OptionEntryLanguageCode::LoadFromIni(string_view category)
}
}
std::vector<std::string> fallbackLocales;
fallbackLocales.reserve(locales.size());
for (const auto &locale : locales) {
std::string neutralLocale = locale.substr(0, locale.find('_'));
if (std::find(fallbackLocales.cbegin(), fallbackLocales.cend(), neutralLocale) == fallbackLocales.cend()) {
fallbackLocales.push_back(neutralLocale);
}
}
for (const auto &fallbackLocale : fallbackLocales) {
LogVerbose("Trying to load fallback translation: {}", fallbackLocale);
if (HasTranslation(fallbackLocale)) {
LogVerbose("Found matching fallback locale: {}", fallbackLocale);
CopyUtf8(szCode, fallbackLocale, sizeof(szCode));
return;
}
}
LogVerbose("No suitable translation found");
strcpy(szCode, "en");
}

14
Source/utils/language.cpp

@ -270,15 +270,19 @@ const std::string &LanguageTranslate(const char *key)
bool HasTranslation(const std::string &locale)
{
for (const char *ext : { ".mo", ".gmo" }) {
SDL_RWops *rw = OpenAsset((locale + ext).c_str());
if (locale == "en") {
return true;
}
constexpr std::array<char *, 2> Extensions { ".mo", ".gmo" };
return std::any_of(Extensions.cbegin(), Extensions.cend(), [locale](const std::string &extension) {
SDL_RWops *rw = OpenAsset((locale + extension).c_str());
if (rw != nullptr) {
SDL_RWclose(rw);
return true;
}
}
return false;
return false;
});
}
bool IsSmallFontTall()

Loading…
Cancel
Save