Added translator that uses google trnslation web page instead of direct API.
This commit is contained in:
parent
39d7686d16
commit
fa071b3603
91
GoogleWebTranslator.cpp
Normal file
91
GoogleWebTranslator.cpp
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
#include <QWebView>
|
||||||
|
#include <QWebFrame>
|
||||||
|
#include <QWebElement>
|
||||||
|
#include <QSettings>
|
||||||
|
#include <QNetworkReply>
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
|
#include "GoogleWebTranslator.h"
|
||||||
|
#include "Settings.h"
|
||||||
|
|
||||||
|
GoogleWebTranslator::GoogleWebTranslator()
|
||||||
|
: QObject (), view_ (new QWebView),
|
||||||
|
isLoadFinished_ (true), isTranslationFinished_ (false) {
|
||||||
|
|
||||||
|
view_->settings()->setAttribute(QWebSettings::AutoLoadImages, false);
|
||||||
|
connect (view_, SIGNAL (loadStarted()), this, SLOT (loadStarted()));
|
||||||
|
connect (view_, SIGNAL (loadFinished(bool)), this, SLOT (loadFinished(bool)));
|
||||||
|
|
||||||
|
connect (view_->page()->networkAccessManager(), SIGNAL (finished(QNetworkReply*)),
|
||||||
|
this, SLOT(replyFinished(QNetworkReply*)));
|
||||||
|
applySettings ();
|
||||||
|
}
|
||||||
|
|
||||||
|
GoogleWebTranslator::~GoogleWebTranslator() {
|
||||||
|
delete view_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GoogleWebTranslator::translate(ProcessingItem item) {
|
||||||
|
queue_.push_back (item);
|
||||||
|
if (isLoadFinished_) {
|
||||||
|
load (item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void GoogleWebTranslator::applySettings(){
|
||||||
|
QSettings settings;
|
||||||
|
settings.beginGroup (settings_names::translationGroup);
|
||||||
|
translationLanguage_ = settings.value (settings_names::translationLanguage,
|
||||||
|
settings_values::translationLanguage).toString ();
|
||||||
|
}
|
||||||
|
|
||||||
|
void GoogleWebTranslator::loadStarted() {
|
||||||
|
isLoadFinished_ = false;
|
||||||
|
isTranslationFinished_ = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GoogleWebTranslator::loadFinished(bool ok) {
|
||||||
|
isLoadFinished_ = true;
|
||||||
|
if (ok && !isTranslationFinished_) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Q_ASSERT (!queue_.isEmpty());
|
||||||
|
ProcessingItem item = queue_.front();
|
||||||
|
queue_.pop_front();
|
||||||
|
if (ok) {
|
||||||
|
QWebElementCollection result = view_->page()->mainFrame()->findAllElements("#result_box > span");
|
||||||
|
item.translated = "";
|
||||||
|
foreach (const QWebElement& element, result) {
|
||||||
|
item.translated += element.toInnerXml() + " ";
|
||||||
|
}
|
||||||
|
emit translated(item, !item.translated.isEmpty());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
emit translated (item, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!queue_.isEmpty()) {
|
||||||
|
load (queue_.front());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void GoogleWebTranslator::replyFinished(QNetworkReply *reply)
|
||||||
|
{
|
||||||
|
if (reply->url().toString().contains ("/translate_a/single")) {
|
||||||
|
isTranslationFinished_ = true;
|
||||||
|
if (isLoadFinished_) {
|
||||||
|
QTimer::singleShot(2000, this, SLOT(loadFinished()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void GoogleWebTranslator::load(const ProcessingItem &item) {
|
||||||
|
Q_ASSERT (!item.recognized.isEmpty ());
|
||||||
|
if (translationLanguage_.isEmpty ()) {
|
||||||
|
emit error (tr ("Неверные парметры для перевода."));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
QUrl url (QString ("https://translate.google.com/#auto/%1/%2").arg(translationLanguage_, item.recognized));
|
||||||
|
view_->setUrl(url);
|
||||||
|
}
|
43
GoogleWebTranslator.h
Normal file
43
GoogleWebTranslator.h
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
#ifndef GOOGLEWEBTRANSLATOR_H
|
||||||
|
#define GOOGLEWEBTRANSLATOR_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
#include "ProcessingItem.h"
|
||||||
|
|
||||||
|
class QWebView;
|
||||||
|
class QUrl;
|
||||||
|
class QNetworkReply;
|
||||||
|
|
||||||
|
class GoogleWebTranslator : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
GoogleWebTranslator();
|
||||||
|
~GoogleWebTranslator();
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void translated (ProcessingItem item, bool success);
|
||||||
|
void error (QString text);
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void translate (ProcessingItem item);
|
||||||
|
void applySettings ();
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void loadStarted ();
|
||||||
|
void loadFinished(bool ok=true);
|
||||||
|
void replyFinished(QNetworkReply * reply);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void load (const ProcessingItem& item);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QVector<ProcessingItem> queue_;
|
||||||
|
QString translationLanguage_;
|
||||||
|
QWebView *view_;
|
||||||
|
bool isLoadFinished_;
|
||||||
|
bool isTranslationFinished_;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // GOOGLEWEBTRANSLATOR_H
|
@ -26,7 +26,8 @@ SOURCES += main.cpp\
|
|||||||
ResultDialog.cpp \
|
ResultDialog.cpp \
|
||||||
ProcessingItem.cpp \
|
ProcessingItem.cpp \
|
||||||
ImageProcessing.cpp \
|
ImageProcessing.cpp \
|
||||||
LanguageHelper.cpp
|
LanguageHelper.cpp \
|
||||||
|
GoogleWebTranslator.cpp
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
Manager.h \
|
Manager.h \
|
||||||
@ -39,7 +40,8 @@ HEADERS += \
|
|||||||
ProcessingItem.h \
|
ProcessingItem.h \
|
||||||
ResultDialog.h \
|
ResultDialog.h \
|
||||||
ImageProcessing.h \
|
ImageProcessing.h \
|
||||||
LanguageHelper.h
|
LanguageHelper.h \
|
||||||
|
GoogleWebTranslator.h
|
||||||
|
|
||||||
FORMS += \
|
FORMS += \
|
||||||
SettingsEditor.ui \
|
SettingsEditor.ui \
|
||||||
|
Loading…
Reference in New Issue
Block a user