This commit is contained in:
寂静的羽夏 2022-10-08 16:37:12 +08:00
parent 0001d3f80e
commit 4c53895fdd
9 changed files with 307 additions and 233 deletions

View File

@ -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 += \

Binary file not shown.

View File

@ -25,38 +25,55 @@
</message>
</context>
<context>
<name>YoudaoTrans</name>
<name>YoudaoService</name>
<message>
<location filename="../youdaotrans.cpp" line="62"/>
<location filename="../youdaoservice.cpp" line="17"/>
<source>Request Youdao API Error</source>
<translation>访 API </translation>
</message>
<message>
<location filename="../youdaotrans.cpp" line="65"/>
<location filename="../youdaotrans.cpp" line="75"/>
<location filename="../youdaotrans.cpp" line="110"/>
<location filename="../youdaoservice.cpp" line="20"/>
<location filename="../youdaoservice.cpp" line="43"/>
<source>YoudaoTrans</source>
<translation></translation>
</message>
<message>
<location filename="../youdaotrans.cpp" line="88"/>
<source>A useful En2Zh translate plugin for WingTool</source>
<translation>便</translation>
</message>
<message>
<location filename="../youdaotrans.cpp" line="106"/>
<location filename="../youdaoservice.cpp" line="39"/>
<source>Enable</source>
<translation></translation>
</message>
<message>
<location filename="../youdaotrans.cpp" line="106"/>
<location filename="../youdaoservice.cpp" line="39"/>
<source>Disalbe</source>
<translation></translation>
</message>
<message>
<location filename="../youdaotrans.cpp" line="107"/>
<location filename="../youdaoservice.cpp" line="40"/>
<source>Success</source>
<translation></translation>
</message>
<message>
<location filename="../youdaoservice.h" line="26"/>
<source>translate</source>
<translation></translation>
</message>
<message>
<location filename="../youdaoservice.h" line="27"/>
<source>toggle</source>
<translation>/</translation>
</message>
</context>
<context>
<name>YoudaoTrans</name>
<message>
<location filename="../youdaotrans.cpp" line="50"/>
<source>YoudaoTrans</source>
<translation></translation>
</message>
<message>
<location filename="../youdaotrans.cpp" line="61"/>
<source>A useful En2Zh translate plugin for WingTool</source>
<translation>便</translation>
</message>
</context>
</TS>

View File

@ -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();

View File

@ -19,6 +19,7 @@ public:
void popup();
protected:
void closeEvent(QCloseEvent *event) override;
void leaveEvent(QEvent *e) override;
void focusOutEvent(QFocusEvent *event) override;

184
youdaoservice.cpp Normal file
View File

@ -0,0 +1,184 @@
#include "youdaoservice.h"
#include <DNotifySender>
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; }

51
youdaoservice.h Normal file
View File

@ -0,0 +1,51 @@
#ifndef YOUDAOSERVICE_H
#define YOUDAOSERVICE_H
#include "../WingTool/plugin/iwingtoolplg.h"
#include "settingdialog.h"
#include "transdialog.h"
#include <QDomDocument>
#include <QObject>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkReply>
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

View File

@ -1,82 +1,59 @@
#include "youdaotrans.h"
#include <DNotifySender>
#include <QApplication>
#include <QClipboard>
#include <QMessageBox>
#include <QSettings>
#include <QtNetwork/QNetworkReply>
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<WingPluginInfo> 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<QObject> YoudaoTrans::serviceHandler() {
return QPointer<QObject>(trans);
}
QVariant YoudaoTrans::pluginServicePipe(int serviceID, QList<QVariant> 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)

View File

@ -3,11 +3,9 @@
#include "../WingTool/plugin/iwingtoolplg.h"
#include "settingdialog.h"
#include "transdialog.h"
#include <QDomDocument>
#include "youdaoservice.h"
#include <QObject>
#include <QTranslator>
#include <QtNetwork/QNetworkAccessManager>
class YoudaoTrans : public IWingToolPlg {
Q_OBJECT
@ -27,38 +25,23 @@ public:
bool init(QList<WingPluginInfo> 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<QObject> serviceHandler() override;
public slots:
QVariant pluginServicePipe(int serviceID, QList<QVariant> 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