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