From 7ac27098cf9c03fa02d9bac4536f7d6ee3159e42 Mon Sep 17 00:00:00 2001 From: Simon Quigley Date: Sat, 23 Dec 2023 17:53:11 -0600 Subject: [PATCH] Don't default to C, and be somewhat reasonable about locales, to start. --- src/installerprompt.cpp | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/src/installerprompt.cpp b/src/installerprompt.cpp index 04bc415..87a20c3 100644 --- a/src/installerprompt.cpp +++ b/src/installerprompt.cpp @@ -376,10 +376,15 @@ QString InstallerPrompt::getDisplayNameForLocale(const QLocale &locale) { return s; }; + QLocale currentAppLocale = QLocale::system(); QString nativeName = locale.nativeLanguageName(); QString nativeCountryName = sanitize(locale.nativeCountryName()); - QString englishLanguageName = QLocale::languageToString(locale.language()); - QString englishCountryName = sanitize(QLocale::countryToString(locale.country())); + QString englishLanguageName = currentAppLocale.languageToString(locale.language()); + QString englishCountryName = sanitize(currentAppLocale.countryToString(locale.country())); + + if (nativeName.isEmpty() || nativeCountryName.isEmpty()) { + return QString(); + } // Rename "American English" to "English" if (locale.language() == QLocale::English) { @@ -419,31 +424,29 @@ void InstallerPrompt::initLanguageComboBox() { } QStringList InstallerPrompt::getAvailableLanguages() { - QMap languageMap; // Default sorting by QString is case-sensitive - - for (int language = QLocale::C; language <= QLocale::LastLanguage; ++language) { - foreach (int country, QLocale::countriesForLanguage(static_cast(language))) { - QLocale locale(static_cast(language), static_cast(country)); + QMap language_map; // Default sorting by QString is case-sensitive - QString displayName = getDisplayNameForLocale(locale); - if (displayName.isEmpty()) continue; + QList all_locales = QLocale::matchingLocales(QLocale::AnyLanguage, QLocale::AnyScript, QLocale::AnyCountry); + for (const QLocale &locale : all_locales) { + QString display_name = getDisplayNameForLocale(locale); + if (display_name.isEmpty()) continue; - languageMap.insert(displayName, locale.name()); - } + language_map.insert(display_name, locale.name()); } + // Sort the language display names - QStringList sortedLanguages = languageMap.keys(); - std::sort(sortedLanguages.begin(), sortedLanguages.end(), [](const QString &a, const QString &b) { + QStringList sorted_languages = language_map.keys(); + std::sort(sorted_languages.begin(), sorted_languages.end(), [](const QString &a, const QString &b) { return a.compare(b, Qt::CaseInsensitive) < 0; }); // Clear the existing languageLocaleMap and repopulate it based on sortedLanguages languageLocaleMap.clear(); - for (const QString &languageName : sortedLanguages) { - languageLocaleMap.insert(languageName, languageMap[languageName]); + for (const QString &language_name : sorted_languages) { + languageLocaleMap.insert(language_name, language_map[language_name]); } - return sortedLanguages; + return sorted_languages; } void InstallerPrompt::onLanguageChanged(int index) {