9#include <KLocalizedString>
10#include <KConfigGroup>
11#include <KSharedConfig>
16 if (!locale.
isValid())
return i18nc(
"Empty locale",
"Empty");
20 const QString lang = QLocale::languageToString(l.language());
21 const QString region = QLocale::countryToString(l.country());
23 if (!lang.isEmpty() && lang !=
"C") {
26 name = i18nc(
"language, region, variant",
"%1, %2, variant: %3", lang, region, locale.
variantTags.join(
"-"));
28 name = i18nc(
"language, variant",
"%1, variant: %2", lang, region);
32 name = i18nc(
"language, variant",
"%1, variant: %2", lang, locale.
variantTags.join(
"-"));
74 return d->locale.toString();
79 if (
d->locale.toString() == newBcp47Tag)
92 return d->locale.scriptTag;
97 if (
d->locale.scriptTag == newScript)
99 d->locale.scriptTag = newScript;
115 if (langOnly.
toString() == newLanguage)
120 if (!langOnly.
isValid())
return;
122 d->favorites->addCode(langOnly.
toString());
125 d->locale = langOnly;
134 const QString code =
"code";
135 const QString name =
"name";
137 for (
int i = 0; i< int(QLocale::LastScript); i++) {
138 const QLocale::Script
script = QLocale::Script(i);
141 map.insert(name, QLocale::scriptToString(
script));
149 return d->filteredLanguagesModel;
159 return d->filteredLanguagesModel->filterRegularExpression().pattern();
164 if (
d->filteredLanguagesModel->filterRegularExpression().pattern() == newSearchString)
166 d->filteredLanguagesModel->setFilterRegularExpression(newSearchString);
172 return d->locale.isValid();
182 for (
int i = 0; i < QLocale::LastLanguage; i++) {
183 const QLocale::Language lang = QLocale::Language(i);
184 const QString langName = QLocale(lang).bcp47Name();
185 if (!
locales.contains(langName)) {
188 Q_FOREACH(
const QLocale::Country region, QLocale::countriesForLanguage(lang)) {
189 const QLocale locale(lang, region);
190 const QString bcp = locale.name().split(
"_").join(
"-");
202 : QAbstractListModel(parent)
216 return d->locales.size();
221 if (index.isValid()) {
223 const QString code =
d->locales.at(index.row());
224 if (role == Qt::DisplayRole) {
227 }
else if (role ==
Code) {
236 QHash<int, QByteArray> roles = QAbstractItemModel::roleNames();
237 roles[
Code] =
"code";
243 config = KSharedConfig::openConfig()->group(
"TextProperties");
245 const QLocale locale(lang);
246 const QString code = locale.bcp47Name().split(
"_").join(
"-");
260 : QAbstractListModel(parent)
273 return d->locales.size();
278 if (index.isValid()) {
279 const QString code =
d->locales.at(index.row());
280 if (role == Qt::DisplayRole) {
283 }
else if (role ==
Code) {
286 return d->favorites.contains(code);
294 if (!index.isValid())
return false;
296 const QString code =
d->locales.at(index.row());
299 const bool fav =
value.toBool();
300 bool updated =
false;
303 if (!
d->favorites.contains(code)) {
304 d->favorites.append(code);
308 const int i =
d->favorites.indexOf(code);
310 d->favorites.removeAt(i);
316 emit dataChanged(index, index, {role});
325 if (!
d->locales.contains(code)) {
326 beginInsertRows(QModelIndex(),
d->locales.size(),
d->locales.size());
327 d->locales.append(code);
334 QHash<int, QByteArray> roles = QAbstractItemModel::roleNames();
335 roles[
Code] =
"code";
346 : QSortFilterProxyModel(parent)
353 QModelIndex idx = sourceModel()->index(source_row, 0, source_parent);
354 const QString name = sourceModel()->data(idx).toString();
357 return (name.contains(filterRegularExpression()) || code.contains(filterRegularExpression()));
float value(const T *src, size_t ch)
const QString localeName(const KoWritingSystemUtils::Bcp47Locale &locale)
int rowCount(const QModelIndex &parent) const override
QVariant data(const QModelIndex &index, int role) const override
AllLanguagesModel(QObject *parent=nullptr)
const QScopedPointer< Private > d
QHash< int, QByteArray > roleNames() const override
The FavoriteLocaleModel class This class keeps track of favorite locales from the config.
QVariant data(const QModelIndex &index, int role) const override
int rowCount(const QModelIndex &parent) const override
void addCode(const QString &code)
FavoriteLocaleModel(QObject *parent=nullptr)
QHash< int, QByteArray > roleNames() const override
bool setData(const QModelIndex &index, const QVariant &value, int role) override
const QScopedPointer< Private > d
static QString scriptTagForQLocaleScript(QLocale::Script script)
static Bcp47Locale parseBcp47Locale(const QString &locale)
static QLocale localeFromBcp47Locale(const Bcp47Locale &locale)
The LanguagesFilterModel class class that tests both the name and the code.
bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override
LanguagesFilterModel(QObject *parent=nullptr)
void setLanguage(const QString &newLanguage)
void setSearchString(const QString &newSearchString)
Q_INVOKABLE QVariantList scriptModel() const
QAbstractItemModel * favoritesModel
QAbstractItemModel * languagesModel
LocaleHandler(QObject *parent=nullptr)
const QScopedPointer< Private > d
void setBcp47Tag(const QString &newBcp47Tag)
Q_INVOKABLE bool validBcp47Tag(const QString &tag) const
void setScript(const QString &newScript)
void searchStringChanged()
The Bcp47Locale class This holds a parsed BCP47 locale. QLocale is primarily made for POSIX locale fo...
FavoriteLocaleModel * favorites
AllLanguagesModel * allLanguages
KoWritingSystemUtils::Bcp47Locale locale
Private(QObject *parent=nullptr)
LanguagesFilterModel * filteredLanguagesModel