From 1fe4fa3b25a3ee95e0139e48334d83b9ed4477af Mon Sep 17 00:00:00 2001 From: EndrII Date: Mon, 15 Feb 2021 13:17:28 +0300 Subject: [PATCH] fix translations --- locales.cpp | 56 ++++++++++++++++++++++++++++++----------------------- locales.h | 16 +++++++-------- 2 files changed, 39 insertions(+), 33 deletions(-) diff --git a/locales.cpp b/locales.cpp index c13e861..857a761 100644 --- a/locales.cpp +++ b/locales.cpp @@ -19,19 +19,27 @@ using namespace QuasarAppUtils; bool Locales::setLocalePrivate(const QLocale &locale) { - auto translator = getTranslator(); + removeOldTranslation(); + QFileInfoList qmFiles; - const auto qmFiles = QDir(_location).entryInfoList({"*" + locale.bcp47Name() + "*.qm"}, QDir::Files); - - for (const auto & file: qmFiles) { - if(!translator->load(file.absoluteFilePath())) { - return false; - } + for (const auto &location: qAsConst(_locations)) { + qmFiles += QDir(location).entryInfoList({"*" + locale.bcp47Name() + "*.qm"}, QDir::Files); } + for (const auto & file: qAsConst(qmFiles)) { + auto translator = new QTranslator(); + + if(!(translator->load(file.absoluteFilePath()) && QCoreApplication::installTranslator(translator))) { + delete translator; + continue; + } + + _translations.push_back(translator); + + } emit sigTranslationChanged(); - return true; + return _translations.size(); } bool Locales::setLocale(const QLocale &locale) { @@ -39,26 +47,20 @@ bool Locales::setLocale(const QLocale &locale) { return obj->setLocalePrivate(locale); } -bool Locales::init(const QLocale &locale, QString location) { +bool Locales::init(const QLocale &locale, const QSet & location) { auto obj = instance(); return obj->initPrivate(locale, location); } -bool Locales::initPrivate(const QLocale &locale, QString location) { - auto translator = getTranslator(); +bool Locales::initPrivate(const QLocale &locale, const QSet & locations) { + auto defaultTr = QLibraryInfo::path(QLibraryInfo::TranslationsPath); - if (location.isEmpty()) - _location = QLibraryInfo::path(QLibraryInfo::TranslationsPath); - else - _location = location; - - if (!setLocale(locale)) { - return false; + _locations = locations; + if (!_locations.contains(defaultTr)) { + _locations += defaultTr; } - QCoreApplication::installTranslator(translator); - - return true; + return setLocalePrivate(locale); } Locales *Locales::instance() { @@ -66,7 +68,13 @@ Locales *Locales::instance() { return instance; } -QTranslator *Locales::getTranslator() { - static QTranslator *translator = new QTranslator(); - return translator; +void Locales::removeOldTranslation() { + for (const auto & tr :qAsConst(_translations)) { + QCoreApplication::removeTranslator(tr); + delete tr; + } +} + +Locales::~Locales() { + removeOldTranslation(); } diff --git a/locales.h b/locales.h index 3c4dfeb..81ba1e3 100644 --- a/locales.h +++ b/locales.h @@ -45,8 +45,7 @@ public: * @return return true if locale set for application */ static bool init(const QLocale &locale = QLocale::system(), - QString location = ""); - + const QSet & location = {}); /** * @brief instance * @return return static object @@ -61,16 +60,15 @@ signals: private: Locales() = default; + ~Locales(); + bool setLocalePrivate(const QLocale &locale = QLocale::system()); bool initPrivate(const QLocale &locale = QLocale::system(), - QString location = ""); + const QSet &location = {}); + void removeOldTranslation(); - /** - * @brief getTranslator - * @return instance of Translation - */ - static QTranslator* getTranslator(); - QString _location; + QSet _locations; + QList _translations; }; }