File indexing completed on 2024-05-12 16:25:39

0001 /*
0002    SPDX-FileCopyrightText: 2020-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "downloadappslanguagesmanager.h"
0008 #include "downloadappslanguagesjob.h"
0009 #include "downloadappslanguagesparser.h"
0010 #include "managerdatapaths.h"
0011 #include "ruqola_debug.h"
0012 #include <QFileInfo>
0013 #include <QStandardPaths>
0014 #include <QTextStream>
0015 
0016 DownloadAppsLanguagesManager::DownloadAppsLanguagesManager(QObject *parent)
0017     : QObject(parent)
0018 {
0019 }
0020 
0021 DownloadAppsLanguagesManager::~DownloadAppsLanguagesManager() = default;
0022 
0023 QString DownloadAppsLanguagesManager::storedFileName() const
0024 {
0025     return ManagerDataPaths::self()->path(ManagerDataPaths::Config, mAccountName) + QStringLiteral("/languages-%1.json").arg(mServerVersion);
0026 }
0027 
0028 void DownloadAppsLanguagesManager::parse(const QString &serverUrl)
0029 {
0030     if (mFileParsed) {
0031         Q_EMIT fileLanguagesParseSuccess();
0032         return;
0033     }
0034     if (mAccountName.isEmpty()) {
0035         qCWarning(RUQOLA_LOG) << "account name is empty. It's a bug";
0036         Q_EMIT fileLanguagesParseFailed(); // Need to load commandlist
0037         return;
0038     }
0039     if (mServerVersion.isEmpty()) {
0040         qCWarning(RUQOLA_LOG) << "serverVersion is empty. It's a bug";
0041         Q_EMIT fileLanguagesParseFailed(); // Need to load commandlist
0042         return;
0043     }
0044     if (QFileInfo::exists(storedFileName())) {
0045         parseLanguageFile();
0046     } else {
0047         auto job = new DownloadAppsLanguagesJob(this);
0048         job->setServerUrl(serverUrl);
0049         connect(job, &DownloadAppsLanguagesJob::fileDownloaded, this, &DownloadAppsLanguagesManager::slotFileDownloaded);
0050         job->start();
0051     }
0052 }
0053 
0054 void DownloadAppsLanguagesManager::slotFileDownloaded(const QByteArray &data)
0055 {
0056     QFile f(storedFileName());
0057     if (f.open(QIODevice::WriteOnly)) {
0058         QTextStream out(&f);
0059         out << data;
0060         f.close();
0061     }
0062     parseLanguageFile();
0063 }
0064 
0065 void DownloadAppsLanguagesManager::parseLanguageFile()
0066 {
0067     DownloadAppsLanguagesParser parser;
0068     parser.setFilename(storedFileName());
0069     if (parser.parse()) {
0070         mLanguageMap = parser.map();
0071         mFileParsed = true;
0072         Q_EMIT fileLanguagesParseSuccess();
0073     } else {
0074         Q_EMIT fileLanguagesParseFailed();
0075     }
0076 }
0077 
0078 QString DownloadAppsLanguagesManager::serverVersion() const
0079 {
0080     return mServerVersion;
0081 }
0082 
0083 void DownloadAppsLanguagesManager::setServerVersion(const QString &serverVersion)
0084 {
0085     mServerVersion = serverVersion;
0086 }
0087 
0088 QString DownloadAppsLanguagesManager::accountName() const
0089 {
0090     return mAccountName;
0091 }
0092 
0093 void DownloadAppsLanguagesManager::setAccountName(const QString &accountName)
0094 {
0095     mAccountName = accountName;
0096 }
0097 
0098 bool DownloadAppsLanguagesManager::fileParsed() const
0099 {
0100     return mFileParsed;
0101 }
0102 
0103 QString DownloadAppsLanguagesManager::translatedString(const QString &language, const QString &id)
0104 {
0105     if (!mFileParsed) {
0106         qCWarning(RUQOLA_LOG) << "language file is not parsed yet!";
0107         return {};
0108     }
0109     QMap<QString, DownloadAppsLanguagesInfo>::const_iterator i = mLanguageMap.constBegin();
0110     while (i != mLanguageMap.constEnd()) {
0111         if (id.contains(i.key())) {
0112             const DownloadAppsLanguagesInfo info = i.value();
0113             const QMap<QString, QMap<QString, QString>> mapLangId = info.languageMap();
0114             QMap<QString, QString> mapId = mapLangId.value(language);
0115             if (mapId.isEmpty()) {
0116                 mapId = mapLangId.value(QStringLiteral("en"));
0117                 if (mapId.isEmpty()) {
0118                     return {};
0119                 }
0120             }
0121             return mapId.value(id);
0122         }
0123         ++i;
0124     }
0125     return {};
0126 }
0127 
0128 #include "moc_downloadappslanguagesmanager.cpp"