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 }