From f8dfe32fda5c750678da35317bf439e243447ce7 Mon Sep 17 00:00:00 2001
From: kwadronaut <kwadronaut@autistici.org>
Date: Fri, 2 Aug 2024 02:51:56 +0200
Subject: [PATCH] gui: Add region to language selections menu when available

we currently have language entries which appears to be repeated
but infact they are different languages, e.g es_AR, es_CU  both
show up as 'Spanish' in the language picker, to make it  easier
to distinguish between them the region is added to the lanugage
picker list, so es_CU now appears as 'Spanish (Cuba)'
---
 gui/main.cpp | 45 +++++++++++++++++++++++++++++++--------------
 1 file changed, 31 insertions(+), 14 deletions(-)

diff --git a/gui/main.cpp b/gui/main.cpp
index 535b6077..2404d5be 100644
--- a/gui/main.cpp
+++ b/gui/main.cpp
@@ -46,31 +46,48 @@ QString getProviderConfig(QJsonValue info, QString provider, QString key, QStrin
     return defaultValue;
 }
 
+// Function to get custom locale name
+QString getCustomLocaleName(const QString &localeCode) {
+    QLocale locale(localeCode);
+    QString language = QLocale::languageToString(locale.language());
+
+    // Special handling for the default locale
+    if (language == "C" || language == "en") {
+        return "English";
+    }
+
+    QString territory = locale.territory() != QLocale::AnyTerritory ? QLocale::territoryToString(locale.territory()) : "";
+
+    if (!territory.isEmpty()) {
+        return QString("%1 (%2)").arg(language, territory);
+    }
+    return language;
+}
+
 QList<QVariant> getAvailableLocales() {
     QString localePath = ":/i18n";
     QDir dir(localePath);
     QStringList fileNames = dir.entryList(QStringList("*.qm"));
 
     QList<QVariant> locales;
-    for (int i = 0; i < fileNames.size(); ++i) {
-        // get locale extracted by filename
-        QString localeName;
-        localeName = fileNames[i]; // "de.qm"
-        localeName.truncate(localeName.lastIndexOf('.')); // "de"
-
-        if (localeName == "base") {
-            localeName = "en";
+    for (const QString &fileName : fileNames) {
+        // Extract locale code from filename
+        QString localeCode = fileName;
+        localeCode.truncate(localeCode.lastIndexOf('.')); // "main_es_CU.qm" -> "main_es_CU"
+
+        if (localeCode == "main_base") {
+            localeCode = "en";
         } else {
-            // remove main_ prefix
-            localeName = localeName.mid(5);
+            // Remove "main_" prefix; main_es_CU -> es_CU
+            localeCode = localeCode.mid(5);
         }
 
+        // Get custom locale name
+        QString localeName = getCustomLocaleName(localeCode);
 
-        QLocale locale = QLocale(localeName);
-        QString name = QLocale::languageToString(locale.language());
         QVariantMap localeObject;
-        localeObject.insert("locale", localeName);
-        localeObject.insert("name", name);
+        localeObject.insert("locale", localeCode);
+        localeObject.insert("name", localeName);
         locales.push_back(localeObject);
     }
 
-- 
GitLab