From f69eaafe864c4679a86051c2ce6e75aa592ab8f7 Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Tue, 16 May 2023 19:20:19 +0300 Subject: [PATCH] Independent translation for piece labels. --- ChangeLog.txt | 1 + .../preferencesconfigurationpage.cpp | 20 +++ .../preferencesconfigurationpage.h | 1 + .../preferencesconfigurationpage.ui | 26 +++- src/libs/vlayout/vtextmanager.cpp | 19 ++- src/libs/vmisc/def.cpp | 141 +++++++++++------- src/libs/vmisc/def.h | 1 + src/libs/vmisc/vabstractvalapplication.cpp | 26 ++++ src/libs/vmisc/vabstractvalapplication.h | 2 + src/libs/vmisc/vcommonsettings.cpp | 17 +++ src/libs/vmisc/vcommonsettings.h | 4 + .../dialogs/support/dialogeditlabel.cpp | 19 ++- 12 files changed, 202 insertions(+), 75 deletions(-) diff --git a/ChangeLog.txt b/ChangeLog.txt index cc164a9cf..869ee6d92 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -27,6 +27,7 @@ - Simplify number of versions for DXF AAMA/ASTM. - New notch type - Check Notch. - Control a notch width and angle with formulas. +- Independent translation for piece labels. # Valentina 0.7.52 September 12, 2022 - Fix crash when default locale is ru. diff --git a/src/app/valentina/dialogs/configpages/preferencesconfigurationpage.cpp b/src/app/valentina/dialogs/configpages/preferencesconfigurationpage.cpp index 501f48bdd..38940cf09 100644 --- a/src/app/valentina/dialogs/configpages/preferencesconfigurationpage.cpp +++ b/src/app/valentina/dialogs/configpages/preferencesconfigurationpage.cpp @@ -59,6 +59,10 @@ PreferencesConfigurationPage::PreferencesConfigurationPage(QWidget *parent) connect(ui->langCombo, QOverload::of(&QComboBox::currentIndexChanged), this, [this]() { m_langChanged = true; }); + InitPieceLabelLanguages(ui->comboBoxPieceLbelLanguage); + connect(ui->comboBoxPieceLbelLanguage, QOverload::of(&QComboBox::currentIndexChanged), this, + [this]() { m_pieceLabelLangChanged = true; }); + //-------------------- Decimal separator setup ui->osOptionCheck->setChecked(VAbstractValApplication::VApp()->ValentinaSettings()->GetOsSeparator()); @@ -203,6 +207,13 @@ auto PreferencesConfigurationPage::Apply() -> QStringList settings->SetDoubleClickZoomFitBestCurrentPP(ui->checkBoxZoomFitBestCurrentPP->isChecked()); settings->SetInteractiveTools(ui->checkBoxInteractiveTools->isChecked()); + if (m_pieceLabelLangChanged) + { + const auto locale = qvariant_cast(ui->comboBoxPieceLbelLanguage->currentData()); + settings->SetPieceLabelLocale(locale); + m_pieceLabelLangChanged = false; + } + if (m_langChanged || m_systemChanged) { const auto locale = qvariant_cast(ui->langCombo->currentData()); @@ -299,4 +310,13 @@ void PreferencesConfigurationPage::RetranslateUi() ui->systemCombo->blockSignals(false); ui->systemCombo->setCurrentIndex(ui->systemCombo->findData(code)); } + + { + ui->comboBoxPieceLbelLanguage->blockSignals(true); + const auto code = qvariant_cast(ui->comboBoxPieceLbelLanguage->currentData()); + InitPieceLabelLanguages(ui->comboBoxPieceLbelLanguage); + ui->comboBoxPieceLbelLanguage->setCurrentIndex(-1); + ui->comboBoxPieceLbelLanguage->blockSignals(false); + ui->comboBoxPieceLbelLanguage->setCurrentIndex(ui->comboBoxPieceLbelLanguage->findData(code)); + } } diff --git a/src/app/valentina/dialogs/configpages/preferencesconfigurationpage.h b/src/app/valentina/dialogs/configpages/preferencesconfigurationpage.h index fd3f9cd95..7683369b2 100644 --- a/src/app/valentina/dialogs/configpages/preferencesconfigurationpage.h +++ b/src/app/valentina/dialogs/configpages/preferencesconfigurationpage.h @@ -53,6 +53,7 @@ private: Q_DISABLE_COPY_MOVE(PreferencesConfigurationPage) // NOLINT Ui::PreferencesConfigurationPage *ui; bool m_langChanged{false}; + bool m_pieceLabelLangChanged{false}; bool m_systemChanged{false}; bool m_unitChanged{false}; bool m_labelLangChanged{false}; diff --git a/src/app/valentina/dialogs/configpages/preferencesconfigurationpage.ui b/src/app/valentina/dialogs/configpages/preferencesconfigurationpage.ui index b037d1f47..0ae06b7f4 100644 --- a/src/app/valentina/dialogs/configpages/preferencesconfigurationpage.ui +++ b/src/app/valentina/dialogs/configpages/preferencesconfigurationpage.ui @@ -35,7 +35,7 @@ 0 0 624 - 867 + 898 @@ -104,13 +104,20 @@ + + + Piece label language: + + + + Decimal separator parts: - + < With OS options > @@ -120,26 +127,29 @@ - + Default unit: - + + + + Label language: - - - - + + + + diff --git a/src/libs/vlayout/vtextmanager.cpp b/src/libs/vlayout/vtextmanager.cpp index abbf61811..df0c69fd3 100644 --- a/src/libs/vlayout/vtextmanager.cpp +++ b/src/libs/vlayout/vtextmanager.cpp @@ -36,7 +36,6 @@ #include #include #include -#include #include "../ifc/xml/vabstractpattern.h" #include "../vmisc/vabstractvalapplication.h" @@ -328,17 +327,20 @@ auto PreparePlaceholders(const VAbstractPattern *doc, const VContainer *data) -> placeholders.insert(pl_pName, QString()); placeholders.insert(pl_pQuantity, QString()); placeholders.insert(pl_wOnFold, QString()); - placeholders.insert(pl_mFabric, QObject::tr("Fabric")); - placeholders.insert(pl_mLining, QObject::tr("Lining")); - placeholders.insert(pl_mInterfacing, QObject::tr("Interfacing")); - placeholders.insert(pl_mInterlining, QObject::tr("Interlining")); - placeholders.insert(pl_wCut, QObject::tr("Cut")); + + QSharedPointer phTr = VAbstractValApplication::VApp()->GetPlaceholderTranslator(); + + placeholders.insert(pl_mFabric, phTr->translate("Placeholder", "Fabric")); + placeholders.insert(pl_mLining, phTr->translate("Placeholder", "Lining")); + placeholders.insert(pl_mInterfacing, phTr->translate("Placeholder", "Interfacing")); + placeholders.insert(pl_mInterlining, phTr->translate("Placeholder", "Interlining")); + placeholders.insert(pl_wCut, phTr->translate("Placeholder", "Cut")); return placeholders; } //--------------------------------------------------------------------------------------------------------------------- -void InitPiecePlaceholders(QMap &placeholders, const QString &name, const VPieceLabelData& data, +void InitPiecePlaceholders(QMap &placeholders, const QString &name, const VPieceLabelData &data, const VContainer *pattern) { placeholders[pl_pLetter] = data.GetLetter(); @@ -352,7 +354,8 @@ void InitPiecePlaceholders(QMap &placeholders, const QString & if (data.IsOnFold()) { - placeholders[pl_wOnFold] = QObject::tr("on fold"); + QSharedPointer phTr = VAbstractValApplication::VApp()->GetPlaceholderTranslator(); + placeholders[pl_wOnFold] = phTr->translate("Placeholder", "on fold"); } VContainer completeData = *pattern; diff --git a/src/libs/vmisc/def.cpp b/src/libs/vmisc/def.cpp index e38cd7f34..1377b44aa 100644 --- a/src/libs/vmisc/def.cpp +++ b/src/libs/vmisc/def.cpp @@ -65,6 +65,79 @@ #include "../vmisc/diagnostic.h" #endif // QT_VERSION < QT_VERSION_CHECK(5, 5, 0) +namespace +{ +//--------------------------------------------------------------------------------------------------------------------- +auto LocalList() -> QStringList +{ + static QStringList fileNames; + + // Check if file names have already been cached + if (!fileNames.isEmpty()) + { + return fileNames; + } + + QDirIterator it(VAbstractApplication::translationsPath(), QStringList("valentina_*.qm"), QDir::Files, + QDirIterator::Subdirectories); + while (it.hasNext()) + { + it.next(); + fileNames.append(it.fileName()); + } + return fileNames; +} + +//--------------------------------------------------------------------------------------------------------------------- +void InitLanguageList(QComboBox *combobox) +{ + SCASSERT(combobox != nullptr) + combobox->clear(); + + const QStringList fileNames = LocalList(); + bool englishUS = false; + const QString en_US = QStringLiteral("en_US"); + + for (auto locale : fileNames) + { + // get locale extracted by filename "valentina_de_De.qm" + locale.truncate(locale.lastIndexOf('.')); // "valentina_de_De" + locale.remove(0, locale.indexOf('_') + 1); // "de_De" + + if (locale.startsWith(QLatin1String("ru"))) + { + continue; + } + + if (not englishUS) + { + englishUS = (en_US == locale); + } + + QLocale loc = QLocale(locale); + QString lang = loc.nativeLanguageName(); + // Since Qt 5.12 country names have spaces + QString country = QLocale::countryToString(loc.country()).remove(' '); + if (country == QLatin1String("Czechia")) + { + country = QLatin1String("CzechRepublic"); + } + QIcon ico(QString("://flags/%1.png").arg(country)); + + combobox->addItem(ico, lang, locale); + } + + if (combobox->count() == 0 || not englishUS) + { + // English language is internal and doens't have own *.qm file. + // Since Qt 5.12 country names have spaces + QIcon ico(QString("://flags/%1.png").arg(QLocale::countryToString(QLocale::UnitedStates).remove(' '))); + QString lang = QLocale(en_US).nativeLanguageName(); + combobox->addItem(ico, lang, en_US); + } +} +} // namespace + //--------------------------------------------------------------------------------------------------------------------- auto QPixmapFromCache(const QString &pixmapPath) -> QPixmap { @@ -478,58 +551,7 @@ auto UnitsToStr(const Unit &unit, const bool translate) -> QString //--------------------------------------------------------------------------------------------------------------------- void InitLanguages(QComboBox *combobox) { - SCASSERT(combobox != nullptr) - combobox->clear(); - - QStringList fileNames; - QDirIterator it(VAbstractApplication::translationsPath(), QStringList("valentina_*.qm"), QDir::Files, - QDirIterator::Subdirectories); - while (it.hasNext()) - { - it.next(); - fileNames.append(it.fileName()); - } - - bool englishUS = false; - const QString en_US = QStringLiteral("en_US"); - - for (auto locale : fileNames) - { - // get locale extracted by filename "valentina_de_De.qm" - locale.truncate(locale.lastIndexOf('.')); // "valentina_de_De" - locale.remove(0, locale.indexOf('_') + 1); // "de_De" - - if (locale.startsWith(QLatin1String("ru"))) - { - continue; - } - - if (not englishUS) - { - englishUS = (en_US == locale); - } - - QLocale loc = QLocale(locale); - QString lang = loc.nativeLanguageName(); - // Since Qt 5.12 country names have spaces - QString country = QLocale::countryToString(loc.country()).remove(' '); - if (country == QLatin1String("Czechia")) - { - country = QLatin1String("CzechRepublic"); - } - QIcon ico(QString("://flags/%1.png").arg(country)); - - combobox->addItem(ico, lang, locale); - } - - if (combobox->count() == 0 || not englishUS) - { - // English language is internal and doens't have own *.qm file. - // Since Qt 5.12 country names have spaces - QIcon ico(QString("://flags/%1.png").arg(QLocale::countryToString(QLocale::UnitedStates).remove(' '))); - QString lang = QLocale(en_US).nativeLanguageName(); - combobox->addItem(ico, lang, en_US); - } + InitLanguageList(combobox); // set default translators and language checked qint32 index = combobox->findData(VAbstractApplication::VApp()->Settings()->GetLocale()); @@ -539,6 +561,21 @@ void InitLanguages(QComboBox *combobox) } } +//--------------------------------------------------------------------------------------------------------------------- +void InitPieceLabelLanguages(QComboBox *combobox) +{ + InitLanguageList(combobox); + + combobox->addItem(QApplication::translate("InitPieceLabelLanguages", "Default"), + VCommonSettings::defaultPieceLabelLocale); + + qint32 index = combobox->findData(VAbstractApplication::VApp()->Settings()->GetPieceLabelLocale()); + if (index != -1) + { + combobox->setCurrentIndex(index); + } +} + const quint32 CustomSARecord::streamHeader = 0xEBFF7586; // CRC-32Q string "CustomSARecord" const quint16 CustomSARecord::classVersion = 1; diff --git a/src/libs/vmisc/def.h b/src/libs/vmisc/def.h index da2d48061..7b7e8ae1b 100644 --- a/src/libs/vmisc/def.h +++ b/src/libs/vmisc/def.h @@ -699,6 +699,7 @@ Q_DECL_RELAXED_CONSTEXPR inline auto UnitConvertor(const QMarginsF &margins, con } void InitLanguages(QComboBox *combobox); +void InitPieceLabelLanguages(QComboBox *combobox); Q_REQUIRED_RESULT auto SupportedLocales() -> QStringList; Q_REQUIRED_RESULT auto StrippedName(const QString &fullFileName) -> QString; diff --git a/src/libs/vmisc/vabstractvalapplication.cpp b/src/libs/vmisc/vabstractvalapplication.cpp index 315783e1e..07f319984 100644 --- a/src/libs/vmisc/vabstractvalapplication.cpp +++ b/src/libs/vmisc/vabstractvalapplication.cpp @@ -82,3 +82,29 @@ auto VAbstractValApplication::VApp() -> VAbstractValApplication * { return qobject_cast(QCoreApplication::instance()); } + +//--------------------------------------------------------------------------------------------------------------------- +auto VAbstractValApplication::GetPlaceholderTranslator() -> QSharedPointer +{ + VValentinaSettings *settings = ValentinaSettings(); + + QString pieceLabelLocale = settings->GetPieceLabelLocale(); + if (pieceLabelLocale == VCommonSettings::defaultPieceLabelLocale) + { + pieceLabelLocale = settings->GetLocale(); + } + + if (pieceLabelLocale.startsWith(QLatin1String("ru"))) + { + return QSharedPointer(new QTranslator); + } + + QSharedPointer translator = QSharedPointer(new QTranslator); + const QString appQmDir = VAbstractApplication::translationsPath(settings->GetLocale()); + if (translator->load(QStringLiteral("valentina_") + pieceLabelLocale, appQmDir)) + { + return translator; + } + + return QSharedPointer(new QTranslator); +} diff --git a/src/libs/vmisc/vabstractvalapplication.h b/src/libs/vmisc/vabstractvalapplication.h index e71286e3b..b047a0c8c 100644 --- a/src/libs/vmisc/vabstractvalapplication.h +++ b/src/libs/vmisc/vabstractvalapplication.h @@ -126,6 +126,8 @@ class VAbstractValApplication : public VAbstractApplication static auto VApp() -> VAbstractValApplication *; + auto GetPlaceholderTranslator() -> QSharedPointer; + protected: QString m_customerName{}; QDate m_customerBirthDate{}; diff --git a/src/libs/vmisc/vcommonsettings.cpp b/src/libs/vmisc/vcommonsettings.cpp index b86319f23..43a031398 100644 --- a/src/libs/vmisc/vcommonsettings.cpp +++ b/src/libs/vmisc/vcommonsettings.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include @@ -71,6 +72,8 @@ const qreal VCommonSettings::defaultScrollingAcceleration = 1.3; const qreal VCommonSettings::scrollingAccelerationMin = 1.0; const qreal VCommonSettings::scrollingAccelerationMax = 10.0; +const QString VCommonSettings::defaultPieceLabelLocale = QStringLiteral("default"); + #ifndef QPRINTENGINE_H Q_DECLARE_METATYPE(QMarginsF) // NOLINT #endif @@ -93,6 +96,8 @@ Q_GLOBAL_STATIC_WITH_ARGS(const QString, settingConfigurationAutosaveState, Q_GLOBAL_STATIC_WITH_ARGS(const QString, settingConfigurationAutosaveTime, (QLatin1String("configuration/autosave/time"))) // NOLINT Q_GLOBAL_STATIC_WITH_ARGS(const QString, settingConfigurationLocale, (QLatin1String("configuration/locale"))) // NOLINT +Q_GLOBAL_STATIC_WITH_ARGS(const QString, settingConfigurationPieceLabelLocale, // NOLINT + (QLatin1String("configuration/pieceLabelLocale"))) Q_GLOBAL_STATIC_WITH_ARGS(const QString, settingPMSystemCode, (QLatin1String("configuration/pmscode"))) // NOLINT Q_GLOBAL_STATIC_WITH_ARGS(const QString, settingConfigurationUnit, (QLatin1String("configuration/unit"))) // NOLINT Q_GLOBAL_STATIC_WITH_ARGS(const QString, settingConfigurationConfirmItemDeletion, @@ -622,6 +627,18 @@ void VCommonSettings::SetLocale(const QString &value) *localeCached = value; } +//--------------------------------------------------------------------------------------------------------------------- +auto VCommonSettings::GetPieceLabelLocale() const -> QString +{ + return value(*settingConfigurationPieceLabelLocale, VCommonSettings::defaultPieceLabelLocale).toString(); +} + +//--------------------------------------------------------------------------------------------------------------------- +void VCommonSettings::SetPieceLabelLocale(const QString &value) +{ + setValue(*settingConfigurationPieceLabelLocale, value); +} + //--------------------------------------------------------------------------------------------------------------------- auto VCommonSettings::GetPMSystemCode() const -> QString { diff --git a/src/libs/vmisc/vcommonsettings.h b/src/libs/vmisc/vcommonsettings.h index e134cd4a3..83274f5bb 100644 --- a/src/libs/vmisc/vcommonsettings.h +++ b/src/libs/vmisc/vcommonsettings.h @@ -99,6 +99,10 @@ class VCommonSettings : public QSettings auto GetLocale() const -> QString; void SetLocale(const QString &value); + static const QString defaultPieceLabelLocale; + auto GetPieceLabelLocale() const -> QString; + void SetPieceLabelLocale(const QString &value); + auto GetPMSystemCode() const -> QString; void SetPMSystemCode(const QString &value); diff --git a/src/libs/vtools/dialogs/support/dialogeditlabel.cpp b/src/libs/vtools/dialogs/support/dialogeditlabel.cpp index 2e9ed6f7e..a26db58d9 100644 --- a/src/libs/vtools/dialogs/support/dialogeditlabel.cpp +++ b/src/libs/vtools/dialogs/support/dialogeditlabel.cpp @@ -670,6 +670,8 @@ void DialogEditLabel::InitPlaceholders() } } + QSharedPointer phTr = VAbstractValApplication::VApp()->GetPlaceholderTranslator(); + // Piece tags m_placeholders.insert(pl_pLetter, qMakePair(tr("Piece letter"), QString())); m_placeholders.insert(pl_pAnnotation, qMakePair(tr("Piece annotation"), QString())); @@ -679,12 +681,14 @@ void DialogEditLabel::InitPlaceholders() m_placeholders.insert(pl_pFoldPosition, qMakePair(tr("Piece fold position"), QString())); m_placeholders.insert(pl_pName, qMakePair(tr("Piece name"), QString())); m_placeholders.insert(pl_pQuantity, qMakePair(tr("Quantity"), QString())); - m_placeholders.insert(pl_mFabric, qMakePair(tr("Material: Fabric"), tr("Fabric"))); - m_placeholders.insert(pl_mLining, qMakePair(tr("Material: Lining"), tr("Lining"))); - m_placeholders.insert(pl_mInterfacing, qMakePair(tr("Material: Interfacing"), tr("Interfacing"))); - m_placeholders.insert(pl_mInterlining, qMakePair(tr("Material: Interlining"), tr("Interlining"))); - m_placeholders.insert(pl_wCut, qMakePair(tr("Word: Cut"), tr("Cut"))); - m_placeholders.insert(pl_wOnFold, qMakePair(tr("Word: on fold"), QString()));// By default should be empty + m_placeholders.insert(pl_mFabric, qMakePair(tr("Material: Fabric"), phTr->translate("Placeholder", "Fabric"))); + m_placeholders.insert(pl_mLining, qMakePair(tr("Material: Lining"), phTr->translate("Placeholder", "Lining"))); + m_placeholders.insert(pl_mInterfacing, + qMakePair(tr("Material: Interfacing"), phTr->translate("Placeholder", "Interfacing"))); + m_placeholders.insert(pl_mInterlining, + qMakePair(tr("Material: Interlining"), phTr->translate("Placeholder", "Interlining"))); + m_placeholders.insert(pl_wCut, qMakePair(tr("Word: Cut"), phTr->translate("Placeholder", "Cut"))); + m_placeholders.insert(pl_wOnFold, qMakePair(tr("Word: on fold"), QString())); // By default should be empty } //--------------------------------------------------------------------------------------------------------------------- @@ -793,7 +797,8 @@ void DialogEditLabel::SetPiece(const VPiece &piece) m_placeholders[pl_pQuantity].second = QString::number(pieceData.GetQuantity()); if (pieceData.IsOnFold()) { - m_placeholders[pl_wOnFold].second = tr("on fold"); + QSharedPointer phTr = VAbstractValApplication::VApp()->GetPlaceholderTranslator(); + m_placeholders[pl_wOnFold].second = phTr->translate("Placeholder", "on fold"); } VContainer completeData = m_doc->GetCompleteData();