From 3a564e85a83b57a795ce706d3c208f35328a40a5 Mon Sep 17 00:00:00 2001 From: Gres Date: Fri, 9 Oct 2015 23:33:35 +0300 Subject: [PATCH] Added support of several translators. --- WebTranslator.cpp | 67 ++++++++++++++++++++++++++++------------------- WebTranslator.h | 5 ++-- 2 files changed, 43 insertions(+), 29 deletions(-) diff --git a/WebTranslator.cpp b/WebTranslator.cpp index 8f16317..e4ac24d 100644 --- a/WebTranslator.cpp +++ b/WebTranslator.cpp @@ -9,10 +9,12 @@ #include "Settings.h" #include "StAssert.h" #include "WebTranslatorProxy.h" +#include "TranslatorHelper.h" WebTranslator::WebTranslator () : QObject (), - proxy_ (new WebTranslatorProxy (this)), view_ (new QWebView), isReady_ (true) { + proxy_ (new WebTranslatorProxy (this)), view_ (new QWebView), + translatorHelper_ (new TranslatorHelper), isReady_ (true) { view_->settings ()->setAttribute (QWebSettings::AutoLoadImages, false); view_->settings ()->setAttribute (QWebSettings::DeveloperExtrasEnabled, true); @@ -29,16 +31,18 @@ WebTranslator::WebTranslator () connect (proxy_, SIGNAL (translated (QString)), SLOT (proxyTranslated (QString))); - applySettings (); + // Delay because it can emit signal that is not connected yet. + QTimer::singleShot (500, this, SLOT (applySettings ())); } WebTranslator::~WebTranslator () { + delete translatorHelper_; delete view_; } void WebTranslator::addProxyToView () { view_->page ()->mainFrame ()->addToJavaScriptWindowObject ("st_wtp", proxy_); - view_->page ()->mainFrame ()->evaluateJavaScript (script_); + view_->page ()->mainFrame ()->evaluateJavaScript (translatorHelper_->currentScript ()); } void WebTranslator::translate (ProcessingItem item) { @@ -47,21 +51,20 @@ void WebTranslator::translate (ProcessingItem item) { } void WebTranslator::translateQueued () { - if (isReady_ && !script_.isEmpty () && !queue_.isEmpty ()) { - isReady_ = false; - runScriptForItem (queue_.first ()); - translationTimeout_.start (); + if (isReady_ && !queue_.isEmpty ()) { + translatorHelper_->newItem (); + proxy_->setItem (queue_.first ()); + if (!tryNextTranslator (true)) { + return; + } } } -void WebTranslator::runScriptForItem (const ProcessingItem &item) { - ST_ASSERT (!script_.isEmpty ()); - proxy_->setItem (item); - view_->page ()->mainFrame ()->evaluateJavaScript ("translate();"); -} - void WebTranslator::proxyTranslated (const QString &text) { if (!queue_.isEmpty () && queue_.first ().recognized == proxy_->sourceText ()) { + if (text.isEmpty () && tryNextTranslator ()) { + return; + } ProcessingItem &item = queue_.first (); item.translated = text; emit translated (item); @@ -70,12 +73,14 @@ void WebTranslator::proxyTranslated (const QString &text) { } void WebTranslator::abortTranslation () { - emit error (tr ("Перевод отменен по таймауту.")); - finishTranslation (); + if (!tryNextTranslator ()) { + emit error (tr ("Перевод отменен по таймауту.")); + finishTranslation (); + } } void WebTranslator::loadFinished (bool ok) { - if (!ok) { + if (!ok && !tryNextTranslator ()) { QString url = view_->url ().toString (); emit error (tr ("Ошибка загрузки страницы (%1) для перевода.").arg (url)); finishTranslation (); @@ -95,6 +100,21 @@ void WebTranslator::finishTranslation (bool markAsTranslated) { translateQueued (); } +bool WebTranslator::tryNextTranslator (bool firstTime) { + QString script = firstTime ? translatorHelper_->currentScript () + : translatorHelper_->nextScript (); + if (script.isEmpty ()) { + return false; + } + translationTimeout_.stop (); + view_->stop (); + addProxyToView (); + view_->page ()->mainFrame ()->evaluateJavaScript ("translate();"); + isReady_ = false; + translationTimeout_.start (); + return true; +} + void WebTranslator::replyFinished (QNetworkReply *reply) { emit proxy_->resourceLoaded (reply->url ().toString ()); } @@ -104,18 +124,11 @@ void WebTranslator::applySettings () { settings.beginGroup (settings_names::translationGroup); #define GET(NAME) settings.value (settings_names::NAME, settings_values::NAME) translationTimeout_.setInterval (GET (translationTimeout).toInt () * 1000); + translatorHelper_->loadScripts (); + if (!translatorHelper_->gotScripts ()) { + emit error (tr ("Нет сценариев для перевода. Измените настройки.")); + } #undef GET - - QFile f ("translators/google.js"); - if (f.open (QFile::ReadOnly)) { - script_ = QString::fromUtf8 (f.readAll ()); - if (script_.isEmpty ()) { - emit error (tr ("Пустой сценарий для перевода. Перевод недоступен.")); - } - } - else { - emit error (tr ("Не считан сценарий для перевода. Перевод недоступен.")); - } } void WebTranslator::setDebugMode (bool isOn) { diff --git a/WebTranslator.h b/WebTranslator.h index 4d8f911..8cb60ba 100644 --- a/WebTranslator.h +++ b/WebTranslator.h @@ -11,6 +11,7 @@ class QWebView; class QNetworkReply; class WebTranslatorProxy; +class TranslatorHelper; class WebTranslator : public QObject { Q_OBJECT @@ -37,15 +38,15 @@ class WebTranslator : public QObject { private: void translateQueued (); - void runScriptForItem (const ProcessingItem &item); void finishTranslation (bool markAsTranslated = true); + bool tryNextTranslator (bool firstTime = false); private: WebTranslatorProxy *proxy_; QWebView *view_; + TranslatorHelper *translatorHelper_; QVector queue_; bool isReady_; - QString script_; QTimer translationTimeout_; };