ScreenTranslator/Translator.cpp

108 lines
3.5 KiB
C++
Raw Normal View History

#include "Translator.h"
2013-11-24 19:43:37 +07:00
#include <QDebug>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QJsonDocument>
#include <QJsonArray>
#include <QJsonParseError>
#include <QSettings>
#include "Settings.h"
#include "GoogleWebTranslator.h"
2015-06-30 00:26:33 +07:00
#include "StAssert.h"
2013-11-24 19:43:37 +07:00
2015-09-23 01:41:08 +07:00
namespace {
2013-11-24 19:43:37 +07:00
const QString translateBaseUrl = "http://translate.google.com/translate_a/"
"t?client=t&text=%1&sl=%2&tl=%3";
2013-11-24 19:43:37 +07:00
}
2015-09-23 01:41:08 +07:00
Translator::Translator (QObject *parent) :
QObject (parent),
network_ (this),
2015-09-23 01:41:08 +07:00
useAlternativeTranslation_ (false) {
connect (&network_, SIGNAL (finished (QNetworkReply *)),
SLOT (replyFinished (QNetworkReply *)));
2013-11-24 19:43:37 +07:00
2015-09-23 01:41:08 +07:00
GoogleWebTranslator *googleWeb = new GoogleWebTranslator;
connect (this, SIGNAL (translateAlternative (ProcessingItem)),
googleWeb, SLOT (translate (ProcessingItem)));
connect (googleWeb, SIGNAL (translated (ProcessingItem, bool)),
2015-09-23 01:41:08 +07:00
this, SLOT (translatedAlternative (ProcessingItem, bool)));
connect (googleWeb, SIGNAL (error (QString)), this, SIGNAL (error (QString)));
2013-11-24 19:43:37 +07:00
applySettings ();
}
2015-09-23 01:41:08 +07:00
void Translator::applySettings () {
2013-11-24 19:43:37 +07:00
QSettings settings;
settings.beginGroup (settings_names::translationGroup);
translationLanguage_ = settings.value (settings_names::translationLanguage,
settings_values::translationLanguage).toString ();
sourceLanguage_ = settings.value (settings_names::sourceLanguage,
settings_values::sourceLanguage).toString ();
}
2015-09-23 01:41:08 +07:00
void Translator::translate (ProcessingItem item) {
if (useAlternativeTranslation_) {
2015-09-23 01:41:08 +07:00
emit translateAlternative (item);
return;
}
2015-06-30 00:26:33 +07:00
ST_ASSERT (!item.recognized.isEmpty ());
QString sourceLanguage = item.sourceLanguage.isEmpty () ? sourceLanguage_ :
2015-09-23 01:41:08 +07:00
item.sourceLanguage;
if (translationLanguage_.isEmpty () || sourceLanguage.isEmpty ()) {
2013-11-24 19:43:37 +07:00
emit error (tr ("Неверные парметры для перевода."));
return;
}
QUrl url (translateBaseUrl.arg (item.recognized, sourceLanguage, translationLanguage_));
2015-09-23 01:41:08 +07:00
QNetworkReply *reply = network_.get (QNetworkRequest (url));
2013-11-26 13:44:00 +07:00
items_.insert (reply, item);
2013-11-24 19:43:37 +07:00
}
2015-09-23 01:41:08 +07:00
void Translator::translatedAlternative (ProcessingItem item, bool success) {
if (success) {
emit translated (item);
}
2015-09-23 01:41:08 +07:00
else {
emit error (tr ("Ошибка альтернативного перевода текста: %1").arg (item.recognized));
}
}
2015-09-23 01:41:08 +07:00
void Translator::replyFinished (QNetworkReply *reply) {
2015-06-30 00:26:33 +07:00
ST_ASSERT (items_.contains (reply));
2013-11-26 13:44:00 +07:00
ProcessingItem item = items_.take (reply);
2015-06-30 00:26:33 +07:00
ST_ASSERT (reply->isFinished ());
2015-09-23 01:41:08 +07:00
if (reply->error () != QNetworkReply::NoError) {
useAlternativeTranslation_ = true;
2015-09-23 01:41:08 +07:00
emit translateAlternative (item);
2013-11-24 19:43:37 +07:00
reply->deleteLater ();
return;
}
QByteArray data = reply->readAll ();
reply->deleteLater ();
2015-09-23 01:41:08 +07:00
while (data.indexOf (",,") != -1) {//make json valid
2013-11-24 19:43:37 +07:00
data.replace (",,", ",");
}
QJsonParseError parseError;
QJsonDocument document = QJsonDocument::fromJson (data, &parseError);
2015-09-23 01:41:08 +07:00
if (document.isEmpty ()) {
useAlternativeTranslation_ = true;
2015-09-23 01:41:08 +07:00
emit translateAlternative (item);
2013-11-24 19:43:37 +07:00
return;
}
QJsonArray answerArray = document.array ();
QJsonArray fullTranslation = answerArray.first ().toArray ();
QString translation = "";
2015-09-23 01:41:08 +07:00
foreach (QJsonValue part, fullTranslation) {
2013-11-24 19:43:37 +07:00
QJsonArray partTranslation = part.toArray ();
2015-09-23 01:41:08 +07:00
if (partTranslation.isEmpty ()) {
2013-11-24 19:43:37 +07:00
continue;
}
translation += partTranslation.at (0).toString ();
}
2013-11-26 13:44:00 +07:00
item.translated = translation;
emit translated (item);
}