File indexing completed on 2024-05-26 04:46:45

0001 /*
0002   SPDX-FileCopyrightText: 2012-2024 Laurent Montel <montel@kde.org>
0003 
0004   SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "autocorrectionlanguage.h"
0008 #include <QLocale>
0009 #include <QSet>
0010 
0011 using namespace TextAutoCorrectionWidgets;
0012 
0013 static bool stripCountryCode(QString *languageCode)
0014 {
0015     const int idx = languageCode->indexOf(QLatin1Char('_'));
0016     if (idx != -1) {
0017         *languageCode = languageCode->left(idx);
0018         return true;
0019     }
0020     return false;
0021 }
0022 
0023 AutoCorrectionLanguage::AutoCorrectionLanguage(QWidget *parent)
0024     : QComboBox(parent)
0025 {
0026     QLocale cLocale(QLocale::C);
0027     QSet<QString> insertedLanguages;
0028     const QList<QLocale> allLocales = QLocale::matchingLocales(QLocale::AnyLanguage, QLocale::AnyScript, QLocale::AnyCountry);
0029     for (const QLocale &lang : allLocales) {
0030         QString languageCode = lang.name();
0031         if (lang != cLocale) {
0032             const QString nativeName = lang.nativeLanguageName();
0033             // For some languages the native name might be empty.
0034             // In this case use the non native language name as fallback.
0035             // See: QTBUG-51323
0036             QString languageName = nativeName.isEmpty() ? QLocale::languageToString(lang.language()) : nativeName;
0037             languageName = languageName.toLower();
0038             if (!insertedLanguages.contains(languageName)) {
0039                 addItem(languageName, languageCode);
0040                 insertedLanguages << languageName;
0041             } else if (stripCountryCode(&languageCode)) {
0042                 if (!insertedLanguages.contains(languageName)) {
0043                     addItem(languageName, languageCode);
0044                     insertedLanguages << languageName;
0045                 }
0046             }
0047         }
0048     }
0049 
0050     QString defaultLang;
0051     if (!QLocale::system().uiLanguages().isEmpty()) {
0052         defaultLang = QLocale::system().uiLanguages().constFirst();
0053         if (defaultLang == QLatin1Char('C')) {
0054             defaultLang = QStringLiteral("en_US");
0055         }
0056     }
0057     const int index = findData(defaultLang);
0058     setCurrentIndex(index);
0059     model()->sort(0);
0060 }
0061 
0062 AutoCorrectionLanguage::~AutoCorrectionLanguage() = default;
0063 
0064 QString AutoCorrectionLanguage::language() const
0065 {
0066     return itemData(currentIndex()).toString();
0067 }
0068 
0069 void AutoCorrectionLanguage::setLanguage(const QString &language)
0070 {
0071     const int index = findData(language);
0072     setCurrentIndex(index);
0073 }