#include #include #include #include #include #include #include "GoogleWebTranslator.h" #include "Settings.h" #include "StAssert.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; } 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); } } 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) { ST_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); }