File indexing completed on 2024-06-23 04:40:32

0001 /*
0002   SPDX-FileCopyrightText: 2022-2024 Laurent Montel <montel@kde.org>
0003 
0004   SPDX-License-Identifier: GPL-2.0-or-later
0005 
0006   based on digikam onlinetranslator code
0007 
0008 */
0009 
0010 #include "lingvaengineplugin.h"
0011 #include "lingvaengineutil.h"
0012 #include "lingvatranslator_debug.h"
0013 #include <TextTranslator/TranslatorEngineAccessManager>
0014 
0015 #include <KConfigGroup>
0016 #include <KSharedConfig>
0017 
0018 #include <QJsonDocument>
0019 #include <QJsonObject>
0020 
0021 LingvaEnginePlugin::LingvaEnginePlugin(QObject *parent)
0022     : TextTranslator::TranslatorEnginePlugin(parent)
0023 {
0024     loadSettings();
0025 }
0026 
0027 LingvaEnginePlugin::~LingvaEnginePlugin() = default;
0028 
0029 void LingvaEnginePlugin::translate()
0030 {
0031     if (verifyFromAndToLanguage()) {
0032         return;
0033     }
0034     translateText();
0035 }
0036 
0037 void LingvaEnginePlugin::translateText()
0038 {
0039     clear();
0040 
0041     const QUrl url(QStringLiteral("%1/api/v1/%2/%3/%4")
0042                        .arg(mServerUrl, languageCode(from()), languageCode(to()), QString::fromUtf8(QUrl::toPercentEncoding(inputText()))));
0043 
0044     qCDebug(TRANSLATOR_LINGVA_LOG) << " url " << url;
0045     const QNetworkRequest request(url);
0046 
0047     QNetworkReply *reply = TextTranslator::TranslatorEngineAccessManager::self()->networkManager()->get(request);
0048     connect(reply, &QNetworkReply::errorOccurred, this, [this, reply](QNetworkReply::NetworkError error) {
0049         slotError(error);
0050         reply->deleteLater();
0051     });
0052     connect(reply, &QNetworkReply::finished, this, [this, reply]() {
0053         reply->deleteLater();
0054         parseTranslation(reply);
0055     });
0056 }
0057 
0058 void LingvaEnginePlugin::parseTranslation(QNetworkReply *reply)
0059 {
0060     if (reply->error() != QNetworkReply::NoError) {
0061         Q_EMIT translateFailed(reply->errorString());
0062         reply->deleteLater();
0063         return;
0064     }
0065 
0066     const QJsonDocument jsonResponse = QJsonDocument::fromJson(reply->readAll());
0067     if (hasDebug()) {
0068         setJsonDebug(QString::fromUtf8(jsonResponse.toJson(QJsonDocument::Indented)));
0069     }
0070 
0071     const QJsonObject responseObject = jsonResponse.object();
0072     setResult(responseObject.value(QStringLiteral("translation")).toString());
0073     reply->deleteLater();
0074     qCDebug(TRANSLATOR_LINGVA_LOG) << " result " << result();
0075     Q_EMIT translateDone();
0076 }
0077 
0078 void LingvaEnginePlugin::loadSettings()
0079 {
0080     KConfigGroup myGroup(KSharedConfig::openConfig(), LingvaEngineUtil::groupName());
0081     mServerUrl = myGroup.readEntry(LingvaEngineUtil::serverUrlKey(), LingvaEngineUtil::defaultServerUrl());
0082 }
0083 
0084 void LingvaEnginePlugin::slotConfigureChanged()
0085 {
0086     loadSettings();
0087 }
0088 
0089 QString LingvaEnginePlugin::languageCode(const QString &langStr)
0090 {
0091     if (langStr == QLatin1String("zh")) {
0092         return QStringLiteral("zh");
0093     } else if (langStr == QLatin1String("zt")) {
0094         return QStringLiteral("zh_HANT");
0095     }
0096     return langStr;
0097 }
0098 
0099 #include "moc_lingvaengineplugin.cpp"