diff --git a/api/logic/translations/TranslationsModel.cpp b/api/logic/translations/TranslationsModel.cpp index 3f374083..b1c65917 100644 --- a/api/logic/translations/TranslationsModel.cpp +++ b/api/logic/translations/TranslationsModel.cpp @@ -43,7 +43,7 @@ struct Language { return 100.0f; } - return float(translated) / float(total); + return 100.0f * float(translated) / float(total); } void setTranslationStats(unsigned _translated, unsigned _untranslated, unsigned _fuzzy) @@ -85,7 +85,7 @@ struct Language file_sha1 = other.file_sha1; translated = other.translated; fuzzy = other.fuzzy; - total = other.fuzzy; + total = other.total; localFileType = other.localFileType; return *this; } @@ -304,20 +304,49 @@ void TranslationsModel::reloadLocalFiles() endInsertRows(); } +namespace { +enum class Column +{ + Language, + Quality +}; +} + + QVariant TranslationsModel::data(const QModelIndex& index, int role) const { if (!index.isValid()) return QVariant(); int row = index.row(); + auto column = static_cast(index.column()); if (row < 0 || row >= d->m_languages.size()) return QVariant(); + auto & lang = d->m_languages[row]; switch (role) { case Qt::DisplayRole: - return d->m_languages[row].locale.nativeLanguageName(); + { + switch(column) + { + case Column::Language: + { + return d->m_languages[row].locale.nativeLanguageName(); + } + case Column::Quality: + { + QString text; + text.sprintf("%3.1f %%", lang.percentTranslated()); + return text; + } + } + } + case Qt::ToolTipRole: + { + return tr("%1:\n%2 translated\n%3 fuzzy\n%4 total").arg(lang.key, QString::number(lang.translated), QString::number(lang.fuzzy), QString::number(lang.total)); + } case Qt::UserRole: return d->m_languages[row].key; default: @@ -325,11 +354,50 @@ QVariant TranslationsModel::data(const QModelIndex& index, int role) const } } +QVariant TranslationsModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + auto column = static_cast(section); + if(role == Qt::DisplayRole) + { + switch(column) + { + case Column::Language: + { + return tr("Language"); + } + case Column::Quality: + { + return tr("Quality"); + } + } + } + else if(role == Qt::ToolTipRole) + { + switch(column) + { + case Column::Language: + { + return tr("The native language name."); + } + case Column::Quality: + { + return tr("Quality is the percentage of fully translated strings, not counting automatically guessed ones."); + } + } + } + return QAbstractListModel::headerData(section, orientation, role); +} + int TranslationsModel::rowCount(const QModelIndex& parent) const { return d->m_languages.size(); } +int TranslationsModel::columnCount(const QModelIndex& parent) const +{ + return 2; +} + Language * TranslationsModel::findLanguage(const QString& key) { auto found = std::find_if(d->m_languages.begin(), d->m_languages.end(), [&](Language & lang) diff --git a/api/logic/translations/TranslationsModel.h b/api/logic/translations/TranslationsModel.h index 5bf769c3..8fee43de 100644 --- a/api/logic/translations/TranslationsModel.h +++ b/api/logic/translations/TranslationsModel.h @@ -28,8 +28,10 @@ public: explicit TranslationsModel(QString path, QObject *parent = 0); virtual ~TranslationsModel(); - virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; - virtual int rowCount(const QModelIndex &parent = QModelIndex()) const override; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + QVariant headerData(int section, Qt::Orientation orientation, int role) const override; + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + int columnCount(const QModelIndex & parent) const override; bool selectLanguage(QString key); void updateLanguage(QString key); diff --git a/application/setupwizard/LanguageWizardPage.cpp b/application/setupwizard/LanguageWizardPage.cpp index dbbe5e7f..9a8fd37f 100644 --- a/application/setupwizard/LanguageWizardPage.cpp +++ b/application/setupwizard/LanguageWizardPage.cpp @@ -3,7 +3,9 @@ #include #include -#include +#include +#include +#include LanguageWizardPage::LanguageWizardPage(QWidget *parent) : BaseWizardPage(parent) @@ -11,15 +13,29 @@ LanguageWizardPage::LanguageWizardPage(QWidget *parent) setObjectName(QStringLiteral("languagePage")); verticalLayout = new QVBoxLayout(this); verticalLayout->setObjectName(QStringLiteral("verticalLayout")); - languageView = new QListView(this); + languageView = new QTreeView(this); languageView->setObjectName(QStringLiteral("languageView")); + languageView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + languageView->setAlternatingRowColors(true); + languageView->setRootIsDecorated(false); + languageView->setItemsExpandable(false); + languageView->setWordWrap(true); + languageView->header()->setCascadingSectionResizes(true); + languageView->header()->setStretchLastSection(false); verticalLayout->addWidget(languageView); + helpUsLabel = new QLabel(this); + helpUsLabel->setTextInteractionFlags(Qt::LinksAccessibleByMouse); + helpUsLabel->setOpenExternalLinks(true); + helpUsLabel->setWordWrap(true); + verticalLayout->addWidget(helpUsLabel); retranslate(); auto translations = MMC->translations(); auto index = translations->selectedIndex(); languageView->setModel(translations.get()); languageView->setCurrentIndex(index); + languageView->header()->setSectionResizeMode(QHeaderView::ResizeToContents); + languageView->header()->setSectionResizeMode(0, QHeaderView::Stretch); connect(languageView->selectionModel(), &QItemSelectionModel::currentRowChanged, this, &LanguageWizardPage::languageRowChanged); } @@ -51,6 +67,11 @@ void LanguageWizardPage::retranslate() { setTitle(tr("Language")); setSubTitle(tr("Select the language to use in MultiMC")); + QString text = + tr("Don't see your language or the quality is poor?") + + "
" + + QString("%1").arg("Help us with translations!"); + helpUsLabel->setText(text); } void LanguageWizardPage::languageRowChanged(const QModelIndex ¤t, const QModelIndex &previous) diff --git a/application/setupwizard/LanguageWizardPage.h b/application/setupwizard/LanguageWizardPage.h index 866f81c3..bfc02c95 100644 --- a/application/setupwizard/LanguageWizardPage.h +++ b/application/setupwizard/LanguageWizardPage.h @@ -3,7 +3,8 @@ #include "BaseWizardPage.h" class QVBoxLayout; -class QListView; +class QTreeView; +class QLabel; class LanguageWizardPage : public BaseWizardPage { @@ -27,5 +28,6 @@ protected slots: private: QVBoxLayout *verticalLayout = nullptr; - QListView *languageView = nullptr; + QTreeView *languageView = nullptr; + QLabel *helpUsLabel = nullptr; };