mirror of
https://github.com/YACReader/yacreader
synced 2026-04-12 15:49:53 -04:00
Fix translator using new backends
This commit is contained in:
@ -89,6 +89,7 @@ target_link_libraries(YACReader PRIVATE
|
||||
Qt::Network
|
||||
Qt::Widgets
|
||||
Qt::Multimedia
|
||||
Qt::TextToSpeech
|
||||
Qt::Svg
|
||||
Qt::Core5Compat
|
||||
comic_backend
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#include <QUrl>
|
||||
|
||||
#include <QMediaPlayer>
|
||||
#include <QTextToSpeech>
|
||||
#include <QJsonDocument>
|
||||
#include <QJsonObject>
|
||||
|
||||
#include <QPushButton>
|
||||
#include <QPalette>
|
||||
@ -26,8 +26,6 @@
|
||||
|
||||
#include <QMessageBox>
|
||||
|
||||
#define APPID "417CEAD93449502CC3C9B69FED26C54118E62BCC"
|
||||
|
||||
YACReaderTranslator::YACReaderTranslator(Viewer *parent)
|
||||
: QWidget(parent), drag(false)
|
||||
{
|
||||
@ -155,7 +153,7 @@ YACReaderTranslator::YACReaderTranslator(Viewer *parent)
|
||||
connect(speakButton, &QAbstractButton::pressed, this, &YACReaderTranslator::play);
|
||||
connect(clearButton, &QAbstractButton::pressed, this, &YACReaderTranslator::clear);
|
||||
|
||||
player = new QMediaPlayer;
|
||||
tts = new QTextToSpeech(this);
|
||||
}
|
||||
|
||||
void YACReaderTranslator::hideResults()
|
||||
@ -179,20 +177,16 @@ void YACReaderTranslator::translate()
|
||||
QString from = this->from->itemData(this->from->currentIndex()).toString();
|
||||
QString to = this->to->itemData(this->to->currentIndex()).toString();
|
||||
|
||||
speakText = text;
|
||||
speakLocale = from;
|
||||
|
||||
TranslationLoader *translationLoader = new TranslationLoader(text, from, to);
|
||||
connect(translationLoader, &TranslationLoader::requestFinished, this, &YACReaderTranslator::setTranslation);
|
||||
connect(translationLoader, &TranslationLoader::error, this, &YACReaderTranslator::error);
|
||||
connect(translationLoader, &TranslationLoader::timeOut, this, &YACReaderTranslator::error);
|
||||
connect(translationLoader, &QThread::finished, translationLoader, &QObject::deleteLater);
|
||||
|
||||
TextToSpeachLoader *tts = new TextToSpeachLoader(text, from);
|
||||
connect(tts, &TextToSpeachLoader::requestFinished, this, &YACReaderTranslator::setSpeak);
|
||||
connect(tts, &TextToSpeachLoader::error, this, &YACReaderTranslator::error);
|
||||
connect(tts, &TextToSpeachLoader::timeOut, this, &YACReaderTranslator::error);
|
||||
connect(tts, &QThread::finished, tts, &QObject::deleteLater);
|
||||
|
||||
translationLoader->start();
|
||||
tts->start();
|
||||
|
||||
resultsTitle->setText(tr("Translation"));
|
||||
|
||||
@ -208,19 +202,12 @@ void YACReaderTranslator::error()
|
||||
busyIndicator->hide();
|
||||
}
|
||||
|
||||
void YACReaderTranslator::setSpeak(const QUrl &url)
|
||||
{
|
||||
resultsTitle->setHidden(false);
|
||||
speakButton->setHidden(false);
|
||||
|
||||
ttsSource = url;
|
||||
}
|
||||
|
||||
void YACReaderTranslator::setTranslation(const QString &string)
|
||||
{
|
||||
resultText->setText(string);
|
||||
|
||||
resultsTitle->setHidden(false);
|
||||
speakButton->setHidden(false);
|
||||
resultText->setHidden(false);
|
||||
busyIndicator->hide();
|
||||
}
|
||||
@ -236,8 +223,8 @@ void YACReaderTranslator::populateCombos()
|
||||
combo->addItem("Arabic", "ar");
|
||||
combo->addItem("Bulgarian", "bg");
|
||||
combo->addItem("Catalan", "ca");
|
||||
combo->addItem("Chinese Simplified", "zh-CHS");
|
||||
combo->addItem("Chinese Traditional", "zh-CHT");
|
||||
combo->addItem("Chinese Simplified", "zh-CN");
|
||||
combo->addItem("Chinese Traditional", "zh-TW");
|
||||
combo->addItem("Czech", "cs");
|
||||
combo->addItem("Danish", "da");
|
||||
combo->addItem("Dutch", "nl");
|
||||
@ -277,10 +264,8 @@ void YACReaderTranslator::populateCombos()
|
||||
|
||||
void YACReaderTranslator::play()
|
||||
{
|
||||
|
||||
player->setSource(ttsSource);
|
||||
|
||||
player->play();
|
||||
tts->setLocale(QLocale(speakLocale));
|
||||
tts->say(speakText);
|
||||
}
|
||||
|
||||
void YACReaderTranslator::mousePressEvent(QMouseEvent *event)
|
||||
@ -324,10 +309,10 @@ void TranslationLoader::run()
|
||||
connect(&tT, &QTimer::timeout, &q, &QEventLoop::quit);
|
||||
connect(&manager, &QNetworkAccessManager::finished, &q, &QEventLoop::quit);
|
||||
|
||||
QString url = "http://api.microsofttranslator.com/V2/Ajax.svc/Translate?appid=%1&from=%2&to=%3&text=%4&contentType=text/plain";
|
||||
url = url.arg(APPID, from, to, text);
|
||||
QString urlStr = QString("https://api.mymemory.translated.net/get?q=%1&langpair=%2|%3")
|
||||
.arg(QString::fromUtf8(QUrl::toPercentEncoding(text)), from, to);
|
||||
|
||||
QNetworkReply *reply = manager.get(QNetworkRequest(QUrl(url)));
|
||||
QNetworkReply *reply = manager.get(QNetworkRequest(QUrl(urlStr)));
|
||||
|
||||
tT.start(5000); // 5s timeout
|
||||
q.exec();
|
||||
@ -335,55 +320,12 @@ void TranslationLoader::run()
|
||||
if (tT.isActive()) {
|
||||
// download complete
|
||||
if (reply->error() == QNetworkReply::NoError) {
|
||||
QString utf8 = QString::fromUtf8(reply->readAll());
|
||||
utf8 = utf8.remove(0, 1);
|
||||
utf8 = utf8.remove(utf8.count() - 1, 1);
|
||||
|
||||
QString translated(utf8);
|
||||
emit requestFinished(translated);
|
||||
} else
|
||||
emit error();
|
||||
} else {
|
||||
emit timeOut();
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//---------------------------------------------------------------------------
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
TextToSpeachLoader::TextToSpeachLoader(QString text, QString language)
|
||||
: QThread(), text(text), language(language)
|
||||
{
|
||||
}
|
||||
|
||||
void TextToSpeachLoader::run()
|
||||
{
|
||||
QNetworkAccessManager manager;
|
||||
QEventLoop q;
|
||||
QTimer tT;
|
||||
|
||||
tT.setSingleShot(true);
|
||||
connect(&tT, &QTimer::timeout, &q, &QEventLoop::quit);
|
||||
connect(&manager, &QNetworkAccessManager::finished, &q, &QEventLoop::quit);
|
||||
|
||||
QString url = "http://api.microsofttranslator.com/V2/Ajax.svc/Speak?appid=%1&language=%2&text=%3&contentType=text/plain";
|
||||
url = url.arg(APPID, language, text);
|
||||
|
||||
QNetworkReply *reply = manager.get(QNetworkRequest(QUrl(url)));
|
||||
|
||||
tT.start(5000); // 5s timeout
|
||||
q.exec();
|
||||
|
||||
if (tT.isActive()) {
|
||||
// download complete
|
||||
if (reply->error() == QNetworkReply::NoError) {
|
||||
QString utf8 = QString::fromUtf8(reply->readAll());
|
||||
utf8 = utf8.remove(0, 1);
|
||||
utf8 = utf8.remove(utf8.count() - 1, 1);
|
||||
utf8 = utf8.replace("\\", "");
|
||||
|
||||
emit requestFinished(QUrl(utf8));
|
||||
QJsonDocument doc = QJsonDocument::fromJson(reply->readAll());
|
||||
QString translated = doc["responseData"]["translatedText"].toString();
|
||||
if (!translated.isEmpty())
|
||||
emit requestFinished(translated);
|
||||
else
|
||||
emit error();
|
||||
} else
|
||||
emit error();
|
||||
} else {
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
#ifndef __TRANSLATOR_H
|
||||
#define __TRANSLATOR_H
|
||||
|
||||
class QUrl;
|
||||
class QMouseEvent;
|
||||
class QPoint;
|
||||
class QTextEdit;
|
||||
@ -9,14 +8,13 @@ class QComboBox;
|
||||
class QLabel;
|
||||
class QPushButton;
|
||||
class YACReaderBusyWidget;
|
||||
class QTextToSpeech;
|
||||
|
||||
#include <QWidget>
|
||||
#include <QThread>
|
||||
#include <QUrl>
|
||||
#include "viewer.h"
|
||||
|
||||
class QMediaPlayer;
|
||||
|
||||
class YACReaderTranslator : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
@ -28,7 +26,6 @@ public slots:
|
||||
|
||||
protected slots:
|
||||
void translate();
|
||||
void setSpeak(const QUrl &url);
|
||||
void setTranslation(const QString &string);
|
||||
void error();
|
||||
void clear();
|
||||
@ -44,7 +41,9 @@ protected:
|
||||
QPoint click;
|
||||
|
||||
private:
|
||||
QMediaPlayer *player;
|
||||
QTextToSpeech *tts;
|
||||
QString speakText;
|
||||
QString speakLocale;
|
||||
|
||||
QTextEdit *text;
|
||||
QComboBox *from;
|
||||
@ -53,7 +52,6 @@ private:
|
||||
QPushButton *speakButton;
|
||||
QLabel *resultText;
|
||||
YACReaderBusyWidget *busyIndicator;
|
||||
QUrl ttsSource;
|
||||
QPushButton *clearButton;
|
||||
};
|
||||
|
||||
@ -74,19 +72,4 @@ private:
|
||||
void run() override;
|
||||
};
|
||||
|
||||
class TextToSpeachLoader : public QThread
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
TextToSpeachLoader(QString text, QString language);
|
||||
signals:
|
||||
void requestFinished(QUrl);
|
||||
void timeOut();
|
||||
void error();
|
||||
|
||||
private:
|
||||
QString text;
|
||||
QString language;
|
||||
void run() override;
|
||||
};
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user