From 732b5e95ce055e46a7e609946216e5023bb4254c Mon Sep 17 00:00:00 2001 From: Simon Quigley Date: Sat, 23 Dec 2023 16:19:44 -0600 Subject: [PATCH] Change the selected language on reload, and ensure Spanish translations work. --- src/installerprompt.cpp | 64 +++++++++++++++++++++++++---------------- src/installerprompt.h | 1 + 2 files changed, 40 insertions(+), 25 deletions(-) diff --git a/src/installerprompt.cpp b/src/installerprompt.cpp index 6c18522..04bc415 100644 --- a/src/installerprompt.cpp +++ b/src/installerprompt.cpp @@ -369,6 +369,33 @@ void InstallerPrompt::refreshNetworkList() { ui->connectWiFiButton->setVisible(!networks.isEmpty()); } +QString InstallerPrompt::getDisplayNameForLocale(const QLocale &locale) { + auto sanitize = [](QString s) -> QString { + s.replace("St.", "Saint", Qt::CaseInsensitive); + s.replace("&", "and", Qt::CaseInsensitive); + return s; + }; + + QString nativeName = locale.nativeLanguageName(); + QString nativeCountryName = sanitize(locale.nativeCountryName()); + QString englishLanguageName = QLocale::languageToString(locale.language()); + QString englishCountryName = sanitize(QLocale::countryToString(locale.country())); + + // Rename "American English" to "English" + if (locale.language() == QLocale::English) { + nativeName = "English"; + englishLanguageName = "English"; + } + + QString displayName = nativeName + " (" + nativeCountryName + ")"; + if (nativeName.compare(englishLanguageName, Qt::CaseInsensitive) != 0 && + nativeCountryName.compare(englishCountryName, Qt::CaseInsensitive) != 0) { + displayName += " - " + englishLanguageName + " (" + englishCountryName + ")"; + } + + return displayName; +} + void InstallerPrompt::initLanguageComboBox() { languageLocaleMap.clear(); QStringList languages = getAvailableLanguages(); @@ -376,43 +403,30 @@ void InstallerPrompt::initLanguageComboBox() { ui->languageComboBox->addItem(language); } - QString defaultLanguage = "English (United States)"; - int defaultIndex = ui->languageComboBox->findText(defaultLanguage); + QLocale currentLocale = QLocale::system(); + QString currentLocaleDisplayName = getDisplayNameForLocale(currentLocale); + + int defaultIndex = ui->languageComboBox->findText(currentLocaleDisplayName); if (defaultIndex != -1) { ui->languageComboBox->setCurrentIndex(defaultIndex); + } else { + // Fallback to English (United States) if current locale is not in the list + defaultIndex = ui->languageComboBox->findText("English (United States)"); + if (defaultIndex != -1) { + ui->languageComboBox->setCurrentIndex(defaultIndex); + } } } QStringList InstallerPrompt::getAvailableLanguages() { QMap languageMap; // Default sorting by QString is case-sensitive - auto sanitize = [](QString s) -> QString { - s.replace("St.", "Saint", Qt::CaseInsensitive); - s.replace("&", "and", Qt::CaseInsensitive); - return s; - }; - 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)); - QString nativeName = locale.nativeLanguageName(); - if (nativeName.isEmpty()) continue; - - QString nativeCountryName = sanitize(locale.nativeCountryName()); - QString englishLanguageName = QLocale::languageToString(locale.language()); - QString englishCountryName = sanitize(QLocale::countryToString(locale.country())); - // Rename "American English" to "English" - if (locale.language() == QLocale::English) { - nativeName = "English"; - englishLanguageName = "English"; - } - - QString displayName = nativeName + " (" + nativeCountryName + ")"; - if (nativeName.compare(englishLanguageName, Qt::CaseInsensitive) != 0 && - nativeCountryName.compare(englishCountryName, Qt::CaseInsensitive) != 0) { - displayName += " - " + englishLanguageName + " (" + englishCountryName + ")"; - } + QString displayName = getDisplayNameForLocale(locale); + if (displayName.isEmpty()) continue; languageMap.insert(displayName, locale.name()); } diff --git a/src/installerprompt.h b/src/installerprompt.h index 53324fd..e9de244 100644 --- a/src/installerprompt.h +++ b/src/installerprompt.h @@ -47,6 +47,7 @@ private: QMap languageLocaleMap; QString selectedLanguage = "English (United States)"; QString localeName = "en_US"; + QString getDisplayNameForLocale(const QLocale &locale); void handleWifiConnection(const QString &ssid, bool recoverFromWrongPassword = false); QString promptForWifiPassword(const QString &ssid, bool isWrongPassword = false);