File indexing completed on 2025-04-27 03:58:38

0001 /* ============================================================
0002  *
0003  * This file is a part of digiKam project
0004  * https://www.digikam.org
0005  *
0006  * Date        : 2018-02-22
0007  * Description : A text translator using web-services - Lingva methods.
0008  *
0009  * SPDX-FileCopyrightText: 2018-2022 by Hennadii Chernyshchyk <genaloner at gmail dot com>
0010  * SPDX-FileCopyrightText: 2021-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
0011  *
0012  * SPDX-License-Identifier: GPL-2.0-or-later
0013  *
0014  * ============================================================ */
0015 
0016 #include "donlinetranslator_p.h"
0017 
0018 namespace Digikam
0019 {
0020 
0021 void DOnlineTranslator::slotRequestLingvaTranslate()
0022 {
0023     const QString sourceText = sender()->property(Private::s_textProperty).toString();
0024 
0025     // Generate API url
0026 
0027     QUrl url(QString::fromUtf8("%1/api/v1/%2/%3/%4")
0028                     .arg(d->lingvaUrl)
0029                     .arg(languageApiCode(Lingva, d->sourceLang))
0030                     .arg(languageApiCode(Lingva, d->translationLang))
0031                     .arg(QString::fromUtf8(QUrl::toPercentEncoding(sourceText))));
0032 
0033     d->currentReply = d->networkManager->get(QNetworkRequest(url));
0034 }
0035 
0036 void DOnlineTranslator::slotParseLingvaTranslate()
0037 {
0038     if ((quintptr)d->currentReply.data() != sender()->property("QNetworkReply").value<quintptr>())
0039     {
0040         return;
0041     }
0042 
0043     d->currentReply->deleteLater();
0044 
0045     // Check for errors
0046 
0047     if (d->currentReply->error() != QNetworkReply::NoError)
0048     {
0049         resetData(NetworkError, d->currentReply->errorString());
0050         return;
0051     }
0052 
0053     // Parse translation data
0054 
0055     const QJsonDocument jsonResponse = QJsonDocument::fromJson(d->currentReply->readAll());
0056     const QJsonObject responseObject = jsonResponse.object();
0057     d->translation                    = responseObject.value(QStringLiteral("translation")).toString();
0058 }
0059 
0060 void DOnlineTranslator::buildLingvaStateMachine()
0061 {
0062     // States
0063 
0064     auto* translationState = new QState(d->stateMachine);
0065     auto* finalState       = new QFinalState(d->stateMachine);
0066     d->stateMachine->setInitialState(translationState);
0067 
0068     // Transitions
0069 
0070     translationState->addTransition(translationState, &QState::finished, finalState);
0071 
0072     // Setup translation state
0073 
0074     buildSplitNetworkRequest(translationState,
0075                              &DOnlineTranslator::slotRequestLingvaTranslate,
0076                              &DOnlineTranslator::slotParseLingvaTranslate,
0077                              d->source,
0078                              Private::s_googleTranslateLimit);
0079 }
0080 
0081 void DOnlineTranslator::buildLingvaDetectStateMachine()
0082 {
0083     // States
0084 
0085     auto* detectState = new QState(d->stateMachine);
0086     auto* finalState  = new QFinalState(d->stateMachine);
0087     d->stateMachine->setInitialState(detectState);
0088 
0089     detectState->addTransition(detectState, &QState::finished, finalState);
0090 
0091     // Setup lang detection state
0092 
0093     const QString text = d->source.left(getSplitIndex(d->source, Private::s_googleTranslateLimit));
0094 
0095     buildNetworkRequestState(detectState,
0096                              &DOnlineTranslator::slotRequestLingvaTranslate,
0097                              &DOnlineTranslator::slotParseLingvaTranslate,
0098                              text);
0099 }
0100 
0101 } // namespace Digikam