added functionality to change app language via settings

This commit is contained in:
vladimir.kuznetsov 2023-06-30 10:40:43 +09:00
parent d0c9c1043c
commit 464d77dfb5
42 changed files with 3333 additions and 1677 deletions

View file

@ -0,0 +1,62 @@
#include "languageModel.h"
LanguageModel::LanguageModel(std::shared_ptr<Settings> settings, QObject *parent)
: m_settings(settings), QAbstractListModel(parent)
{
QMetaEnum metaEnum = QMetaEnum::fromType<LanguageSettings::AvailableLanguageEnum>();
for (int i = 0; i < metaEnum.keyCount(); i++) {
m_availableLanguages.push_back(
LanguageModelData { metaEnum.valueToKey(i), static_cast<LanguageSettings::AvailableLanguageEnum>(i) });
}
}
int LanguageModel::rowCount(const QModelIndex &parent) const
{
return static_cast<int>(m_availableLanguages.size());
}
QVariant LanguageModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid() || index.row() < 0 || index.row() >= static_cast<int>(m_availableLanguages.size())) {
return QVariant();
}
switch (role) {
case NameRole: {
return m_availableLanguages[index.row()].name;
break;
}
case IndexRole: {
return static_cast<int>(m_availableLanguages[index.row()].index);
break;
}
}
return QVariant();
}
QHash<int, QByteArray> LanguageModel::roleNames() const
{
QHash<int, QByteArray> roles;
roles[NameRole] = "languageName";
roles[IndexRole] = "languageIndex";
return roles;
}
void LanguageModel::changeLanguage(const LanguageSettings::AvailableLanguageEnum language)
{
switch (language) {
case LanguageSettings::AvailableLanguageEnum::English: emit updateTranslations(QLocale::English); break;
case LanguageSettings::AvailableLanguageEnum::Russian: emit updateTranslations(QLocale::Russian); break;
default: emit updateTranslations(QLocale::English); break;
}
}
int LanguageModel::getCurrentLanguageIndex()
{
auto locale = m_settings->getAppLanguage();
switch (locale.language()) {
case QLocale::English: return static_cast<int>(LanguageSettings::AvailableLanguageEnum::English); break;
case QLocale::Russian: return static_cast<int>(LanguageSettings::AvailableLanguageEnum::Russian); break;
default: return static_cast<int>(LanguageSettings::AvailableLanguageEnum::English); break;
}
}

View file

@ -0,0 +1,62 @@
#ifndef LANGUAGEMODEL_H
#define LANGUAGEMODEL_H
#include <QAbstractListModel>
#include <QQmlEngine>
#include "settings.h"
namespace LanguageSettings
{
Q_NAMESPACE
enum class AvailableLanguageEnum {
English,
Russian
};
Q_ENUM_NS(AvailableLanguageEnum)
static void declareQmlAvailableLanguageEnum()
{
qmlRegisterUncreatableMetaObject(LanguageSettings::staticMetaObject, "AvailableLanguageEnum", 1, 0,
"AvailableLanguageEnum", QString());
}
}
struct LanguageModelData
{
QString name;
LanguageSettings::AvailableLanguageEnum index;
};
class LanguageModel : public QAbstractListModel
{
Q_OBJECT
public:
enum Roles {
NameRole = Qt::UserRole + 1,
IndexRole
};
LanguageModel(std::shared_ptr<Settings> settings, QObject *parent = nullptr);
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
public slots:
void changeLanguage(const LanguageSettings::AvailableLanguageEnum language);
int getCurrentLanguageIndex();
signals:
void updateTranslations(const QLocale &locale);
protected:
QHash<int, QByteArray> roleNames() const override;
private:
QVector<LanguageModelData> m_availableLanguages;
std::shared_ptr<Settings> m_settings;
};
#endif // LANGUAGEMODEL_H