Added translator that uses google trnslation web page instead of direct API.

This commit is contained in:
Gres 2015-04-11 12:01:10 +03:00
parent 39d7686d16
commit fa071b3603
3 changed files with 138 additions and 2 deletions

91
GoogleWebTranslator.cpp Normal file
View File

@ -0,0 +1,91 @@
#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;
}
Q_ASSERT (!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) {
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);
}

43
GoogleWebTranslator.h Normal file
View File

@ -0,0 +1,43 @@
#ifndef GOOGLEWEBTRANSLATOR_H
#define GOOGLEWEBTRANSLATOR_H
#include <QObject>
#include "ProcessingItem.h"
class QWebView;
class QUrl;
class QNetworkReply;
class GoogleWebTranslator : public QObject
{
Q_OBJECT
public:
GoogleWebTranslator();
~GoogleWebTranslator();
signals:
void translated (ProcessingItem item, bool success);
void error (QString text);
public slots:
void translate (ProcessingItem item);
void applySettings ();
private slots:
void loadStarted ();
void loadFinished(bool ok=true);
void replyFinished(QNetworkReply * reply);
private:
void load (const ProcessingItem& item);
private:
QVector<ProcessingItem> queue_;
QString translationLanguage_;
QWebView *view_;
bool isLoadFinished_;
bool isTranslationFinished_;
};
#endif // GOOGLEWEBTRANSLATOR_H

View File

@ -26,7 +26,8 @@ SOURCES += main.cpp\
ResultDialog.cpp \ ResultDialog.cpp \
ProcessingItem.cpp \ ProcessingItem.cpp \
ImageProcessing.cpp \ ImageProcessing.cpp \
LanguageHelper.cpp LanguageHelper.cpp \
GoogleWebTranslator.cpp
HEADERS += \ HEADERS += \
Manager.h \ Manager.h \
@ -39,7 +40,8 @@ HEADERS += \
ProcessingItem.h \ ProcessingItem.h \
ResultDialog.h \ ResultDialog.h \
ImageProcessing.h \ ImageProcessing.h \
LanguageHelper.h LanguageHelper.h \
GoogleWebTranslator.h
FORMS += \ FORMS += \
SettingsEditor.ui \ SettingsEditor.ui \