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 9339ba7..be3093f 100644
Binary files a/lang/zh.qm and b/lang/zh.qm differ
diff --git a/lang/zh.ts b/lang/zh.ts
index 4966bf4..6e89079 100644
--- a/lang/zh.ts
+++ b/lang/zh.ts
@@ -25,38 +25,55 @@
- 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