From 4c53895fdda81d1d34a61319db34e80bba06f028 Mon Sep 17 00:00:00 2001 From: wingsummer <1326224942@qq.com> Date: Sat, 8 Oct 2022 16:37:12 +0800 Subject: [PATCH] update --- YoudaoTrans.pro | 6 +- lang/zh.qm | Bin 732 -> 910 bytes lang/zh.ts | 43 ++++++--- transdialog.cpp | 5 ++ transdialog.h | 1 + youdaoservice.cpp | 184 ++++++++++++++++++++++++++++++++++++++ youdaoservice.h | 51 +++++++++++ youdaotrans.cpp | 223 ++++++---------------------------------------- youdaotrans.h | 27 ++---- 9 files changed, 307 insertions(+), 233 deletions(-) create mode 100644 youdaoservice.cpp create mode 100644 youdaoservice.h diff --git a/YoudaoTrans.pro b/YoudaoTrans.pro index 7dc1a8d..16b587d 100644 --- a/YoudaoTrans.pro +++ b/YoudaoTrans.pro @@ -26,13 +26,15 @@ DEFINES += QT_DEPRECATED_WARNINGS SOURCES += \ youdaotrans.cpp \ transdialog.cpp \ - settingdialog.cpp + settingdialog.cpp \ + youdaoservice.cpp HEADERS += \ youdaotrans.h \ ../WingTool/plugin/iwingtoolplg.h \ transdialog.h \ - settingdialog.h + settingdialog.h \ + youdaoservice.h DISTFILES += YoudaoTrans.json RESOURCES += \ diff --git a/lang/zh.qm b/lang/zh.qm index 9339ba719f593e81f6ebc08e080a9ec0e78f9816..be3093f9f42a83e91f96087b9d3acf5e4b3ef9c3 100644 GIT binary patch delta 353 zcmcb^+Q&XYu0DgMQa6DC2w09(sxmMz^07~P`Ul80W8ZoY#Q(*i{q{4EJ_@0k&T~Ws z1I3v%I0_Hz0O@d!J(E&^>T@|yZx9F4Tex=40jZzB&DnGm$bZQ9BqRvPx5{K-U}jGI^j2l`^TL z3$0*MuSYeD5o9M@JOhJ%U@-@f$-oA}CHd*;IjQVGCKlB!^}o9>!qsw?6eZ>r=OmWk eQm*62;HOop;n!Ec*KcC%)5#f(nUmKt=>q^Hcx9yk delta 141 zcmeBUzr#8~PBVa|Qa6DC2w09(sxmMzwy;ln`Ul80 - YoudaoTrans + YoudaoService - + Request Youdao API Error 访问有道翻译 API 失败! - - - + + YoudaoTrans 有道翻译 - - A useful En2Zh translate plugin for WingTool - 一个用于羽云工具箱的方便易用的英到汉翻译插件 - - - + Enable 启用 - + Disalbe 禁用 - + Success 有道翻译成功 + + + translate + 翻译 + + + + toggle + 开/关 + + + + YoudaoTrans + + + YoudaoTrans + 有道翻译 + + + + A useful En2Zh translate plugin for WingTool + 一个用于羽云工具箱的方便易用的英到汉翻译插件 + diff --git a/transdialog.cpp b/transdialog.cpp index 5d8b058..644e116 100644 --- a/transdialog.cpp +++ b/transdialog.cpp @@ -49,6 +49,11 @@ void TransDialog::popup() { raise(); } +void TransDialog::closeEvent(QCloseEvent *event) { + Q_UNUSED(event); + hide(); +} + void TransDialog::leaveEvent(QEvent *e) { Q_UNUSED(e); hide(); diff --git a/transdialog.h b/transdialog.h index 3887cf4..fa9d501 100644 --- a/transdialog.h +++ b/transdialog.h @@ -19,6 +19,7 @@ public: void popup(); protected: + void closeEvent(QCloseEvent *event) override; void leaveEvent(QEvent *e) override; void focusOutEvent(QFocusEvent *event) override; diff --git a/youdaoservice.cpp b/youdaoservice.cpp new file mode 100644 index 0000000..4000315 --- /dev/null +++ b/youdaoservice.cpp @@ -0,0 +1,184 @@ +#include "youdaoservice.h" +#include + +DCORE_USE_NAMESPACE + +YoudaoService::YoudaoService(QObject *parent) : QObject(parent) { + loadSettings(); + + dialog = new TransDialog; + net = new QNetworkAccessManager(this); + connect(net, &QNetworkAccessManager::finished, this, + [=](QNetworkReply *reply) { + if (reply && reply->error() == QNetworkReply::NoError) { + QByteArray data = reply->readAll(); + this->parse(data); + } else { + DUtil::DNotifySender sender(tr("Request Youdao API Error")); + sender.appIcon("dialog-error"); + sender.timeOut(1000); + sender.appName(tr("YoudaoTrans")); + sender.call(); + } + reply->close(); + }); + + sm = new SettingDialog(m_sel, m_cp); + sm->setYoudaoEnabled(m_enabled); + connect(sm, &SettingDialog::sigCpEnabled, this, [=](bool v) { m_cp = v; }); + connect(sm, &SettingDialog::sigSelEnabled, this, [=](bool v) { m_sel = v; }); +} + +YoudaoService::~YoudaoService() { dialog->deleteLater(); } + +bool YoudaoService::enabled() const { return m_enabled; } + +void YoudaoService::setEnabled(bool enabled) { + m_enabled = enabled; + sm->setYoudaoEnabled(enabled); + DUtil::DNotifySender sender((enabled ? tr("Enable") : tr("Disalbe")) + + tr("Success")); + sender.appIcon(m_enabled ? "dialog-ok" : "dialog-warning"); + sender.timeOut(1000); + sender.appName(tr("YoudaoTrans")); + sender.call(); +} + +void YoudaoService::translate(QString word) { + if (m_enabled && isVaildWord(word)) + net->get(QNetworkRequest( + QUrl("http://dict.youdao.com/fsearch?client=deskdict&q=" + + QUrl::toPercentEncoding(word) + + "&pos=-1&doctype=xml&xmlVersion=3.2&dogVersion=1.0&" + "vendor=unknown&appVer=3.1.17.4208&le=eng"))); +} + +void YoudaoService::toggle() { setEnabled(!enabled()); } + +void YoudaoService::parse(QByteArray &content) { + QDomDocument dom; + QString errstr; + int row, col; + if (!dom.setContent(content, false, &errstr, &row, &col)) { + return; + } + + auto doc = dom.documentElement(); + if (doc.tagName() != "yodaodict") + return; + + auto nodeList = doc.childNodes(); + auto len = nodeList.size(); + + if (len) { + QString word, ukphonetic, usphonetic, trans, youtrans; + + for (auto i = 0; i < len; i++) { + auto node = nodeList.at(i).toElement(); + auto name = node.tagName(); + + if (name == "return-phrase") { + word = node.text(); + } else if (name == "uk-phonetic-symbol") { + ukphonetic = node.text(); + } else if (name == "us-phonetic-symbol") { + usphonetic = node.text(); + } else if (name == "custom-translation") { + trans = parseCustomTrans(node); + } else if (name == "yodao-web-dict") { + youtrans = parseYoudaoTrans(node); + } + } + + QString content; + if (trans.length()) { + content = trans; + if (youtrans.length()) { + content += "\n\n---\n\n" + youtrans; + } + } else { + content = youtrans; + } + + dialog->setInfo(word, ukphonetic, usphonetic, content); + dialog->popup(); + } +} + +QString YoudaoService::parseCustomTrans(QDomElement &ele) { + auto nodeList = ele.childNodes(); + auto len = nodeList.size(); + QStringList content; + if (len) { + for (auto i = 0; i < len; i++) { + auto node = nodeList.at(i).toElement(); + auto name = node.tagName(); + if (name == "translation") { + content << node.firstChild().toElement().text(); + } + } + return content.join("\n\n"); + } else { + return QString(); + } +} + +QString YoudaoService::parseYoudaoTrans(QDomElement &ele) { + auto nodeList = ele.childNodes(); + auto len = nodeList.size(); + QStringList content; + if (len) { + for (auto i = 0; i < len; i++) { + QString key; + QStringList trans; + auto node = nodeList.at(i).toElement(); + auto nodes = node.childNodes(); + auto count = nodes.size(); + for (auto y = 0; y < count; y++) { + auto inode = nodes.at(y).toElement(); + auto name = inode.tagName(); + if (name == "trans") { + trans << inode.firstChild().toElement().text(); + } else if (name == "key") { + key = inode.text(); + } + } + content << "### " + key + "\n\n* " + trans.join("\n\n* "); + } + return content.join("\n\n"); + } else { + return QString(); + } +} + +bool YoudaoService::isVaildWord(QString &word) { + word = word.trimmed(); + if (word.isEmpty()) + return false; + for (auto &c : word) { + if (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '-' || + c == ' ')) + return false; + } + return true; +} + +void YoudaoService::showSettings() { sm->exec(); } + +bool YoudaoService::sel() const { return m_sel; } + +void YoudaoService::loadSettings() { + QSettings settings(QApplication::organizationName(), "YoudaoTrans"); + m_cp = settings.value("enablecp", true).toBool(); + m_sel = settings.value("enablesel", true).toBool(); + m_enabled = settings.value("enabled", true).toBool(); +} + +void YoudaoService::saveSettings() { + QSettings settings(QApplication::organizationName(), "YoudaoTrans"); + settings.setValue("enablecp", m_cp); + settings.setValue("enablesel", m_sel); + settings.setValue("enabled", m_sel); +} + +bool YoudaoService::cp() const { return m_cp; } diff --git a/youdaoservice.h b/youdaoservice.h new file mode 100644 index 0000000..bbdf7b4 --- /dev/null +++ b/youdaoservice.h @@ -0,0 +1,51 @@ +#ifndef YOUDAOSERVICE_H +#define YOUDAOSERVICE_H + +#include "../WingTool/plugin/iwingtoolplg.h" +#include "settingdialog.h" +#include "transdialog.h" +#include +#include +#include +#include + +class YoudaoService : public QObject { + Q_OBJECT +public: + YoudaoService(QObject *parent = nullptr); + virtual ~YoudaoService(); + + bool enabled() const; + void setEnabled(bool enabled); + + bool cp() const; + bool sel() const; + + // 用于本地化 + void translation() { + tr("translate"); + tr("toggle"); + } + +public slots: + PLUGINSRV void translate(QString word); + PLUGINSRV void toggle(); + + void parse(QByteArray &content); + QString parseCustomTrans(QDomElement &ele); + QString parseYoudaoTrans(QDomElement &ele); + + bool isVaildWord(QString &word); + void showSettings(); + void loadSettings(); + void saveSettings(); + +private: + bool m_enabled; + bool m_cp, m_sel; + QNetworkAccessManager *net; + SettingDialog *sm; + TransDialog *dialog; +}; + +#endif // YOUDAOSERVICE_H diff --git a/youdaotrans.cpp b/youdaotrans.cpp index d5d8817..5fd530c 100644 --- a/youdaotrans.cpp +++ b/youdaotrans.cpp @@ -1,82 +1,59 @@ #include "youdaotrans.h" -#include #include #include #include #include -#include -DCORE_USE_NAMESPACE +YoudaoTrans::YoudaoTrans(QObject *parent) { + Q_UNUSED(parent); -YoudaoTrans::YoudaoTrans(QObject *parent) - : m_cp(true), m_sel(true), m_enabled(true) { - Q_UNUSED(parent) + auto s = GETPLUGINQM("YoudaoTrans.qm"); + if (!translator.load(s) || !QApplication::installTranslator(&translator)) { + QMessageBox::critical(nullptr, "Error", "Error Loading File!", + QMessageBox::Ok); + localiztion = false; // 构造函数不具有返回值,只能先存着标识 + return; + } + + trans = new YoudaoService(this); } int YoudaoTrans::sdkVersion() { return SDKVERSION; } QString YoudaoTrans::signature() { return WINGSUMMER; } -YoudaoTrans::~YoudaoTrans() { dialog->deleteLater(); } +YoudaoTrans::~YoudaoTrans() {} bool YoudaoTrans::init(QList loadedplugin) { Q_UNUSED(loadedplugin); - auto s = GETPLUGINQM("YoudaoTrans.qm"); - if (!translator.load(s) || !QApplication::installTranslator(&translator)) { - QMessageBox::critical(nullptr, "Error", "Error Loading File!", - QMessageBox::Ok); + if (!localiztion) // 加载语言本地化失败,报告失败 return false; - } - - loadSettings(); - dialog = new TransDialog; - sm = new SettingDialog(m_sel, m_cp); - sm->setYoudaoEnabled(m_enabled); - connect(sm, &SettingDialog::sigCpEnabled, this, [=](bool v) { m_cp = v; }); - connect(sm, &SettingDialog::sigSelEnabled, this, [=](bool v) { m_sel = v; }); // 初始化剪切板监控 auto clipboard = qApp->clipboard(); connect(clipboard, &QClipboard::selectionChanged, this, [=] { - if (m_sel) { + if (trans->sel()) { auto word = clipboard->text(QClipboard::Selection); - if (this->isVaildWord(word)) - this->translate(word); + if (trans->isVaildWord(word)) + trans->translate(word); } }); connect(clipboard, &QClipboard::dataChanged, this, [=] { - if (m_cp) { + if (trans->cp()) { auto word = clipboard->text(); - if (this->isVaildWord(word)) - this->translate(word); + if (trans->isVaildWord(word)) + trans->translate(word); } }); - net = new QNetworkAccessManager(this); - connect(net, &QNetworkAccessManager::finished, this, - [=](QNetworkReply *reply) { - if (reply && reply->error() == QNetworkReply::NoError) { - QByteArray data = reply->readAll(); - this->parse(data); - } else { - DUtil::DNotifySender sender(tr("Request Youdao API Error")); - sender.appIcon("dialog-error"); - sender.timeOut(1000); - sender.appName(tr("YoudaoTrans")); - sender.call(); - } - reply->close(); - }); return true; } -void YoudaoTrans::unload() { saveSettings(); } +void YoudaoTrans::unload() { trans->saveSettings(); } QString YoudaoTrans::pluginName() { return tr("YoudaoTrans"); } -QString YoudaoTrans::provider() { return "youdaotr"; } - QString YoudaoTrans::pluginAuthor() { return WINGSUMMER; } IWingToolPlg::Catagorys YoudaoTrans::pluginCatagory() { @@ -91,165 +68,19 @@ QString YoudaoTrans::pluginComment() { QIcon YoudaoTrans::pluginIcon() { return QIcon(":/youdaotr/icon.png"); } -QStringList YoudaoTrans::pluginServices() { return {"Translate", "Toggle"}; } +const QMetaObject *YoudaoTrans::serviceMeta() { return trans->metaObject(); } -QStringList YoudaoTrans::pluginServiceNames() { return {"翻译", "开/关"}; } +const QPointer YoudaoTrans::serviceHandler() { + return QPointer(trans); +} QVariant YoudaoTrans::pluginServicePipe(int serviceID, QList params) { - switch (serviceID) { - case 0: { - auto content = params.first(); - if (content.canConvert(QMetaType::QString)) - translate(content.toString()); - } break; - case 1: { - m_enabled = !m_enabled; - sm->setYoudaoEnabled(m_enabled); - DUtil::DNotifySender sender((m_enabled ? tr("Enable") : tr("Disalbe")) + - tr("Success")); - sender.appIcon(m_enabled ? "dialog-ok" : "dialog-warning"); - sender.timeOut(1000); - sender.appName(tr("YoudaoTrans")); - sender.call(); - } break; - default: - break; - } + Q_UNUSED(serviceID); + Q_UNUSED(params); return QVariant(); } -void YoudaoTrans::onSetting() { sm->exec(); } - -void YoudaoTrans::translate(QString word) { - if (m_enabled && isVaildWord(word)) - net->get(QNetworkRequest( - QUrl("http://dict.youdao.com/fsearch?client=deskdict&q=" + - QUrl::toPercentEncoding(word) + - "&pos=-1&doctype=xml&xmlVersion=3.2&dogVersion=1.0&" - "vendor=unknown&appVer=3.1.17.4208&le=eng"))); -} - -void YoudaoTrans::parse(QByteArray &content) { - QDomDocument dom; - QString errstr; - int row, col; - if (!dom.setContent(content, false, &errstr, &row, &col)) { - return; - } - - auto doc = dom.documentElement(); - if (doc.tagName() != "yodaodict") - return; - - auto nodeList = doc.childNodes(); - auto len = nodeList.size(); - - if (len) { - QString word, ukphonetic, usphonetic, trans, youtrans; - - for (auto i = 0; i < len; i++) { - auto node = nodeList.at(i).toElement(); - auto name = node.tagName(); - - if (name == "return-phrase") { - word = node.text(); - } else if (name == "uk-phonetic-symbol") { - ukphonetic = node.text(); - } else if (name == "us-phonetic-symbol") { - usphonetic = node.text(); - } else if (name == "custom-translation") { - trans = parseCustomTrans(node); - } else if (name == "yodao-web-dict") { - youtrans = parseYoudaoTrans(node); - } - } - - QString content; - if (trans.length()) { - content = trans; - if (youtrans.length()) { - content += "\n\n---\n\n" + youtrans; - } - } else { - content = youtrans; - } - - dialog->setInfo(word, ukphonetic, usphonetic, content); - dialog->popup(); - } -} - -QString YoudaoTrans::parseCustomTrans(QDomElement &ele) { - auto nodeList = ele.childNodes(); - auto len = nodeList.size(); - QStringList content; - if (len) { - for (auto i = 0; i < len; i++) { - auto node = nodeList.at(i).toElement(); - auto name = node.tagName(); - if (name == "translation") { - content << node.firstChild().toElement().text(); - } - } - return content.join("\n\n"); - } else { - return QString(); - } -} - -QString YoudaoTrans::parseYoudaoTrans(QDomElement &ele) { - auto nodeList = ele.childNodes(); - auto len = nodeList.size(); - QStringList content; - if (len) { - for (auto i = 0; i < len; i++) { - QString key; - QStringList trans; - auto node = nodeList.at(i).toElement(); - auto nodes = node.childNodes(); - auto count = nodes.size(); - for (auto y = 0; y < count; y++) { - auto inode = nodes.at(y).toElement(); - auto name = inode.tagName(); - if (name == "trans") { - trans << inode.firstChild().toElement().text(); - } else if (name == "key") { - key = inode.text(); - } - } - content << "### " + key + "\n\n* " + trans.join("\n\n* "); - } - return content.join("\n\n"); - } else { - return QString(); - } -} - -bool YoudaoTrans::isVaildWord(QString &word) { - word = word.trimmed(); - if (word.isEmpty()) - return false; - for (auto &c : word) { - if (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '-' || - c == ' ')) - return false; - } - return true; -} - -void YoudaoTrans::loadSettings() { - QSettings settings(QApplication::organizationName(), "YoudaoTrans"); - m_cp = settings.value("enablecp", true).toBool(); - m_sel = settings.value("enablesel", true).toBool(); - m_enabled = settings.value("enabled", true).toBool(); -} - -void YoudaoTrans::saveSettings() { - QSettings settings(QApplication::organizationName(), "YoudaoTrans"); - settings.setValue("enablecp", m_cp); - settings.setValue("enablesel", m_sel); - settings.setValue("enabled", m_sel); -} +void YoudaoTrans::onSetting() { trans->showSettings(); } #if QT_VERSION < 0x050000 Q_EXPORT_PLUGIN2(YoudaoTrans, GenericPlugin) diff --git a/youdaotrans.h b/youdaotrans.h index dc13131..8666fd1 100644 --- a/youdaotrans.h +++ b/youdaotrans.h @@ -3,11 +3,9 @@ #include "../WingTool/plugin/iwingtoolplg.h" #include "settingdialog.h" -#include "transdialog.h" -#include +#include "youdaoservice.h" #include #include -#include class YoudaoTrans : public IWingToolPlg { Q_OBJECT @@ -27,38 +25,23 @@ public: bool init(QList loadedplugin) override; void unload() override; QString pluginName() override; - QString provider() override; QString pluginAuthor() override; Catagorys pluginCatagory() override; uint pluginVersion() override; QString pluginComment() override; QIcon pluginIcon() override; - QStringList pluginServices() override; - QStringList pluginServiceNames() override; + const QMetaObject *serviceMeta() override; + const QPointer serviceHandler() override; public slots: QVariant pluginServicePipe(int serviceID, QList params) override; virtual void onSetting() override; private: - void translate(QString word); - void parse(QByteArray &content); - QString parseCustomTrans(QDomElement &ele); - QString parseYoudaoTrans(QDomElement &ele); - - bool isVaildWord(QString &word); - - void loadSettings(); - void saveSettings(); - -private: - TransDialog *dialog; - SettingDialog *sm; QTranslator translator; - QNetworkAccessManager *net; + YoudaoService *trans; - bool m_cp, m_sel; - bool m_enabled; + bool localiztion = true; }; #endif // GENERICPLUGIN_H