2015-04-11 16:01:10 +07:00
|
|
|
#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;
|
|
|
|
}
|
|
|
|
|
2015-06-30 00:25:25 +07:00
|
|
|
if (!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);
|
2015-04-11 16:01:10 +07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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);
|
|
|
|
}
|