1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
/*
SPDX-FileCopyrightText: 2022-2026 Laurent Montel <montel@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "deeplengineclient.h"
using namespace Qt::Literals::StringLiterals;
#include "deeplengineconfiguredialog.h"
#include "deeplengineplugin.h"
#include "deeplengineutil.h"
#include "deepltranslator_debug.h"
#include "translator/misc/translatorutil.h"
#include <KConfigGroup>
#include <KLocalizedString>
#include <KSharedConfig>
#include <QPointer>
#include <qt6keychain/keychain.h>
DeeplEngineClient::DeeplEngineClient(QObject *parent)
: TextTranslator::TranslatorEngineClient{parent}
{
}
DeeplEngineClient::~DeeplEngineClient() = default;
QString DeeplEngineClient::name() const
{
return u"deepl"_s;
}
QString DeeplEngineClient::translatedName() const
{
return i18n("DeepL");
}
TextTranslator::TranslatorEnginePlugin *DeeplEngineClient::createTranslator()
{
auto enginePlugin = new DeeplEnginePlugin();
connect(this, &DeeplEngineClient::configureChanged, enginePlugin, &DeeplEnginePlugin::slotConfigureChanged);
return enginePlugin;
}
QMap<TextTranslator::TranslatorUtil::Language, QString> DeeplEngineClient::supportedFromLanguages()
{
if (mFromLanguages.isEmpty()) {
mFromLanguages = fillLanguages();
}
return mFromLanguages;
}
QMap<TextTranslator::TranslatorUtil::Language, QString> DeeplEngineClient::supportedToLanguages()
{
return supportedFromLanguages();
}
bool DeeplEngineClient::isSupported(TextTranslator::TranslatorUtil::Language lang) const
{
switch (lang) {
case TextTranslator::TranslatorUtil::automatic:
case TextTranslator::TranslatorUtil::bg:
case TextTranslator::TranslatorUtil::cs:
case TextTranslator::TranslatorUtil::da:
case TextTranslator::TranslatorUtil::de:
case TextTranslator::TranslatorUtil::en:
case TextTranslator::TranslatorUtil::el:
case TextTranslator::TranslatorUtil::es:
case TextTranslator::TranslatorUtil::et:
case TextTranslator::TranslatorUtil::fi:
case TextTranslator::TranslatorUtil::fr:
case TextTranslator::TranslatorUtil::hu:
case TextTranslator::TranslatorUtil::id:
case TextTranslator::TranslatorUtil::it:
case TextTranslator::TranslatorUtil::ja:
case TextTranslator::TranslatorUtil::lt:
case TextTranslator::TranslatorUtil::lv:
case TextTranslator::TranslatorUtil::nl:
case TextTranslator::TranslatorUtil::pl:
case TextTranslator::TranslatorUtil::pt:
case TextTranslator::TranslatorUtil::ro:
case TextTranslator::TranslatorUtil::ru:
case TextTranslator::TranslatorUtil::sk:
case TextTranslator::TranslatorUtil::sl:
case TextTranslator::TranslatorUtil::sv:
case TextTranslator::TranslatorUtil::tr:
case TextTranslator::TranslatorUtil::uk:
case TextTranslator::TranslatorUtil::zh:
return true;
default:
break;
}
return false;
}
bool DeeplEngineClient::hasConfigurationDialog() const
{
return true;
}
bool DeeplEngineClient::showConfigureDialog(QWidget *parentWidget)
{
bool settingsChanged = false;
QPointer<DeeplEngineConfigureDialog> dlg = new DeeplEngineConfigureDialog(parentWidget);
KConfigGroup myGroup(KSharedConfig::openConfig(), DeeplEngineUtil::groupName());
dlg->setUseFreeLicenceKey(myGroup.readEntry(DeeplEngineUtil::freeLicenseKey(), false));
auto readJob = new QKeychain::ReadPasswordJob(DeeplEngineUtil::translatorGroupName(), this);
connect(readJob, &QKeychain::Job::finished, this, [dlg](QKeychain::Job *baseJob) {
auto job = qobject_cast<QKeychain::ReadPasswordJob *>(baseJob);
Q_ASSERT(job);
if (job->error()) {
qCWarning(TRANSLATOR_DEEPL_LOG) << "We have an error during reading password " << job->errorString();
} else {
dlg->setApiKey(job->textData());
}
});
readJob->setKey(DeeplEngineUtil::apiGroupName());
readJob->start();
if (dlg->exec()) {
myGroup.writeEntry(DeeplEngineUtil::freeLicenseKey(), dlg->useFreeLicenceKey());
myGroup.sync();
auto writeJob = new QKeychain::WritePasswordJob(DeeplEngineUtil::translatorGroupName(), this);
connect(writeJob, &QKeychain::Job::finished, this, &DeeplEngineClient::slotPasswordWritten);
writeJob->setKey(DeeplEngineUtil::apiGroupName());
writeJob->setTextData(dlg->apiKey());
writeJob->start();
Q_EMIT configureChanged();
settingsChanged = true;
}
delete dlg;
return settingsChanged;
}
TextTranslator::TranslatorEngineClient::EngineType DeeplEngineClient::engineType() const
{
return TextTranslator::TranslatorEngineClient::Network;
}
void DeeplEngineClient::slotPasswordWritten(QKeychain::Job *baseJob)
{
if (baseJob->error()) {
qCWarning(TRANSLATOR_DEEPL_LOG) << "Error writing password using QKeychain:" << baseJob->errorString();
}
}
#include "moc_deeplengineclient.cpp"
|