ScreenTranslator/GoogleWebTranslator.cpp

93 lines
2.6 KiB
C++
Raw Normal View History

#include <QWebView>
#include <QWebFrame>
#include <QWebElement>
#include <QSettings>
#include <QNetworkReply>
#include <QTimer>
#include "GoogleWebTranslator.h"
#include "Settings.h"
2015-06-30 00:26:33 +07:00
#include "StAssert.h"
2015-09-23 01:41:08 +07:00
GoogleWebTranslator::GoogleWebTranslator ()
: QObject (), view_ (new QWebView),
2015-09-23 01:41:08 +07:00
isLoadFinished_ (true), isTranslationFinished_ (false) {
2015-09-23 01:41:08 +07:00
view_->settings ()->setAttribute (QWebSettings::AutoLoadImages, false);
connect (view_, SIGNAL (loadStarted ()), this, SLOT (loadStarted ()));
connect (view_, SIGNAL (loadFinished (bool)), this, SLOT (loadFinished (bool)));
2015-09-23 01:41:08 +07:00
connect (view_->page ()->networkAccessManager (), SIGNAL (finished (QNetworkReply *)),
this, SLOT (replyFinished (QNetworkReply *)));
applySettings ();
}
2015-09-23 01:41:08 +07:00
GoogleWebTranslator::~GoogleWebTranslator () {
delete view_;
}
2015-09-23 01:41:08 +07:00
void GoogleWebTranslator::translate (ProcessingItem item) {
queue_.push_back (item);
if (isLoadFinished_) {
load (item);
}
}
2015-09-23 01:41:08 +07:00
void GoogleWebTranslator::applySettings () {
QSettings settings;
settings.beginGroup (settings_names::translationGroup);
translationLanguage_ = settings.value (settings_names::translationLanguage,
settings_values::translationLanguage).toString ();
}
2015-09-23 01:41:08 +07:00
void GoogleWebTranslator::loadStarted () {
isLoadFinished_ = false;
isTranslationFinished_ = false;
}
2015-09-23 01:41:08 +07:00
void GoogleWebTranslator::loadFinished (bool ok) {
isLoadFinished_ = true;
if (ok && !isTranslationFinished_) {
2015-09-23 01:41:08 +07:00
return;
}
2015-09-23 01:41:08 +07:00
if (!queue_.isEmpty ()) {
ProcessingItem item = queue_.front ();
queue_.pop_front ();
2015-06-30 00:25:25 +07:00
if (ok) {
2015-09-23 01:41:08 +07:00
QWebElementCollection result = view_->page ()->mainFrame ()->findAllElements ("#result_box > span");
2015-06-30 00:25:25 +07:00
item.translated = "";
2015-09-23 01:41:08 +07:00
foreach (const QWebElement &element, result) {
item.translated += element.toInnerXml () + " ";
2015-06-30 00:25:25 +07:00
}
2015-09-23 01:41:08 +07:00
emit translated (item, !item.translated.isEmpty ());
2015-06-30 00:25:25 +07:00
}
else {
emit translated (item, false);
}
}
2015-09-23 01:41:08 +07:00
if (!queue_.isEmpty ()) {
load (queue_.front ());
}
}
2015-09-23 01:41:08 +07:00
void GoogleWebTranslator::replyFinished (QNetworkReply *reply) {
if (reply->url ().toString ().contains ("/translate_a/single")) {
isTranslationFinished_ = true;
if (isLoadFinished_) {
2015-09-23 01:41:08 +07:00
QTimer::singleShot (2000, this, SLOT (loadFinished ()));
}
}
}
2015-09-23 01:41:08 +07:00
void GoogleWebTranslator::load (const ProcessingItem &item) {
2015-06-30 00:26:33 +07:00
ST_ASSERT (!item.recognized.isEmpty ());
if (translationLanguage_.isEmpty ()) {
emit error (tr ("Неверные парметры для перевода."));
return;
}
2015-09-23 01:41:08 +07:00
QUrl url (QString ("https://translate.google.com/#auto/%1/%2").arg (translationLanguage_, item.recognized));
view_->setUrl (url);
}