Added support of several translators.
This commit is contained in:
parent
6bacb14c56
commit
3a564e85a8
@ -9,10 +9,12 @@
|
|||||||
#include "Settings.h"
|
#include "Settings.h"
|
||||||
#include "StAssert.h"
|
#include "StAssert.h"
|
||||||
#include "WebTranslatorProxy.h"
|
#include "WebTranslatorProxy.h"
|
||||||
|
#include "TranslatorHelper.h"
|
||||||
|
|
||||||
WebTranslator::WebTranslator ()
|
WebTranslator::WebTranslator ()
|
||||||
: QObject (),
|
: 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::AutoLoadImages, false);
|
||||||
view_->settings ()->setAttribute (QWebSettings::DeveloperExtrasEnabled, true);
|
view_->settings ()->setAttribute (QWebSettings::DeveloperExtrasEnabled, true);
|
||||||
@ -29,16 +31,18 @@ WebTranslator::WebTranslator ()
|
|||||||
|
|
||||||
connect (proxy_, SIGNAL (translated (QString)), SLOT (proxyTranslated (QString)));
|
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 () {
|
WebTranslator::~WebTranslator () {
|
||||||
|
delete translatorHelper_;
|
||||||
delete view_;
|
delete view_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebTranslator::addProxyToView () {
|
void WebTranslator::addProxyToView () {
|
||||||
view_->page ()->mainFrame ()->addToJavaScriptWindowObject ("st_wtp", proxy_);
|
view_->page ()->mainFrame ()->addToJavaScriptWindowObject ("st_wtp", proxy_);
|
||||||
view_->page ()->mainFrame ()->evaluateJavaScript (script_);
|
view_->page ()->mainFrame ()->evaluateJavaScript (translatorHelper_->currentScript ());
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebTranslator::translate (ProcessingItem item) {
|
void WebTranslator::translate (ProcessingItem item) {
|
||||||
@ -47,21 +51,20 @@ void WebTranslator::translate (ProcessingItem item) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void WebTranslator::translateQueued () {
|
void WebTranslator::translateQueued () {
|
||||||
if (isReady_ && !script_.isEmpty () && !queue_.isEmpty ()) {
|
if (isReady_ && !queue_.isEmpty ()) {
|
||||||
isReady_ = false;
|
translatorHelper_->newItem ();
|
||||||
runScriptForItem (queue_.first ());
|
proxy_->setItem (queue_.first ());
|
||||||
translationTimeout_.start ();
|
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) {
|
void WebTranslator::proxyTranslated (const QString &text) {
|
||||||
if (!queue_.isEmpty () && queue_.first ().recognized == proxy_->sourceText ()) {
|
if (!queue_.isEmpty () && queue_.first ().recognized == proxy_->sourceText ()) {
|
||||||
|
if (text.isEmpty () && tryNextTranslator ()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
ProcessingItem &item = queue_.first ();
|
ProcessingItem &item = queue_.first ();
|
||||||
item.translated = text;
|
item.translated = text;
|
||||||
emit translated (item);
|
emit translated (item);
|
||||||
@ -70,12 +73,14 @@ void WebTranslator::proxyTranslated (const QString &text) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void WebTranslator::abortTranslation () {
|
void WebTranslator::abortTranslation () {
|
||||||
|
if (!tryNextTranslator ()) {
|
||||||
emit error (tr ("Перевод отменен по таймауту."));
|
emit error (tr ("Перевод отменен по таймауту."));
|
||||||
finishTranslation ();
|
finishTranslation ();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebTranslator::loadFinished (bool ok) {
|
void WebTranslator::loadFinished (bool ok) {
|
||||||
if (!ok) {
|
if (!ok && !tryNextTranslator ()) {
|
||||||
QString url = view_->url ().toString ();
|
QString url = view_->url ().toString ();
|
||||||
emit error (tr ("Ошибка загрузки страницы (%1) для перевода.").arg (url));
|
emit error (tr ("Ошибка загрузки страницы (%1) для перевода.").arg (url));
|
||||||
finishTranslation ();
|
finishTranslation ();
|
||||||
@ -95,6 +100,21 @@ void WebTranslator::finishTranslation (bool markAsTranslated) {
|
|||||||
translateQueued ();
|
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) {
|
void WebTranslator::replyFinished (QNetworkReply *reply) {
|
||||||
emit proxy_->resourceLoaded (reply->url ().toString ());
|
emit proxy_->resourceLoaded (reply->url ().toString ());
|
||||||
}
|
}
|
||||||
@ -104,18 +124,11 @@ void WebTranslator::applySettings () {
|
|||||||
settings.beginGroup (settings_names::translationGroup);
|
settings.beginGroup (settings_names::translationGroup);
|
||||||
#define GET(NAME) settings.value (settings_names::NAME, settings_values::NAME)
|
#define GET(NAME) settings.value (settings_names::NAME, settings_values::NAME)
|
||||||
translationTimeout_.setInterval (GET (translationTimeout).toInt () * 1000);
|
translationTimeout_.setInterval (GET (translationTimeout).toInt () * 1000);
|
||||||
|
translatorHelper_->loadScripts ();
|
||||||
|
if (!translatorHelper_->gotScripts ()) {
|
||||||
|
emit error (tr ("Нет сценариев для перевода. Измените настройки."));
|
||||||
|
}
|
||||||
#undef GET
|
#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) {
|
void WebTranslator::setDebugMode (bool isOn) {
|
||||||
|
@ -11,6 +11,7 @@ class QWebView;
|
|||||||
class QNetworkReply;
|
class QNetworkReply;
|
||||||
|
|
||||||
class WebTranslatorProxy;
|
class WebTranslatorProxy;
|
||||||
|
class TranslatorHelper;
|
||||||
|
|
||||||
class WebTranslator : public QObject {
|
class WebTranslator : public QObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@ -37,15 +38,15 @@ class WebTranslator : public QObject {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void translateQueued ();
|
void translateQueued ();
|
||||||
void runScriptForItem (const ProcessingItem &item);
|
|
||||||
void finishTranslation (bool markAsTranslated = true);
|
void finishTranslation (bool markAsTranslated = true);
|
||||||
|
bool tryNextTranslator (bool firstTime = false);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
WebTranslatorProxy *proxy_;
|
WebTranslatorProxy *proxy_;
|
||||||
QWebView *view_;
|
QWebView *view_;
|
||||||
|
TranslatorHelper *translatorHelper_;
|
||||||
QVector<ProcessingItem> queue_;
|
QVector<ProcessingItem> queue_;
|
||||||
bool isReady_;
|
bool isReady_;
|
||||||
QString script_;
|
|
||||||
QTimer translationTimeout_;
|
QTimer translationTimeout_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user