2013-11-23 14:00:22 +07:00
|
|
|
#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"
|
|
|
|
|
|
|
|
namespace
|
|
|
|
{
|
|
|
|
const QString translateBaseUrl = "http://translate.google.com/translate_a/"
|
2014-03-30 17:56:21 +07:00
|
|
|
"t?client=t&text=%1&sl=%2&tl=%3";
|
2013-11-24 19:43:37 +07:00
|
|
|
}
|
|
|
|
|
2013-11-23 14:00:22 +07:00
|
|
|
Translator::Translator(QObject *parent) :
|
2013-11-24 19:43:37 +07:00
|
|
|
QObject(parent),
|
|
|
|
network_ (this)
|
|
|
|
{
|
|
|
|
connect (&network_, SIGNAL (finished (QNetworkReply*)),
|
|
|
|
SLOT (replyFinished (QNetworkReply*)));
|
|
|
|
|
|
|
|
applySettings ();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Translator::applySettings()
|
2013-11-23 14:00:22 +07:00
|
|
|
{
|
2013-11-24 19:43:37 +07:00
|
|
|
QSettings settings;
|
|
|
|
settings.beginGroup (settings_names::translationGroup);
|
|
|
|
translationLanguage_ = settings.value (settings_names::translationLanguage,
|
2014-03-30 17:56:21 +07:00
|
|
|
settings_values::translationLanguage).toString ();
|
|
|
|
sourceLanguage_ = settings.value (settings_names::sourceLanguage,
|
|
|
|
settings_values::sourceLanguage).toString ();
|
2013-11-23 14:00:22 +07:00
|
|
|
}
|
|
|
|
|
2013-11-26 13:44:00 +07:00
|
|
|
void Translator::translate(ProcessingItem item)
|
2013-11-23 14:00:22 +07:00
|
|
|
{
|
2013-11-26 13:44:00 +07:00
|
|
|
Q_ASSERT (!item.recognized.isEmpty ());
|
2013-11-24 19:43:37 +07:00
|
|
|
if (translationLanguage_.isEmpty ())
|
|
|
|
{
|
|
|
|
emit error (tr ("Неверные парметры для перевода."));
|
|
|
|
return;
|
|
|
|
}
|
2014-03-30 17:56:21 +07:00
|
|
|
QUrl url (translateBaseUrl.arg (item.recognized, sourceLanguage_, translationLanguage_));
|
2013-11-26 13:44:00 +07:00
|
|
|
QNetworkReply* reply = network_.get (QNetworkRequest (url));
|
|
|
|
items_.insert (reply, item);
|
2013-11-24 19:43:37 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
void Translator::replyFinished(QNetworkReply* reply)
|
|
|
|
{
|
2013-11-26 13:44:00 +07:00
|
|
|
Q_ASSERT (items_.contains (reply));
|
|
|
|
ProcessingItem item = items_.take (reply);
|
2013-11-24 19:43:37 +07:00
|
|
|
Q_ASSERT (reply->isFinished ());
|
|
|
|
if (reply->error () != QNetworkReply::NoError)
|
|
|
|
{
|
|
|
|
emit error (tr ("Ошибка перевода: %1").arg (reply->errorString ()));
|
|
|
|
reply->deleteLater ();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
QByteArray data = reply->readAll ();
|
|
|
|
reply->deleteLater ();
|
2013-11-23 14:00:22 +07:00
|
|
|
|
2013-11-24 19:43:37 +07:00
|
|
|
while (data.indexOf (",,") != -1)//make json valid
|
|
|
|
{
|
|
|
|
data.replace (",,", ",");
|
|
|
|
}
|
|
|
|
QJsonParseError parseError;
|
|
|
|
QJsonDocument document = QJsonDocument::fromJson (data, &parseError);
|
|
|
|
if (document.isEmpty ())
|
|
|
|
{
|
|
|
|
emit error (tr ("Ошибка разбора перевода: %1 (%2)").
|
|
|
|
arg (parseError.errorString ()).arg (parseError.offset));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
QJsonArray answerArray = document.array ();
|
|
|
|
QJsonArray fullTranslation = answerArray.first ().toArray ();
|
|
|
|
QString translation = "";
|
|
|
|
foreach (QJsonValue part, fullTranslation)
|
|
|
|
{
|
|
|
|
QJsonArray partTranslation = part.toArray ();
|
|
|
|
if (partTranslation.isEmpty ())
|
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
translation += partTranslation.at (0).toString ();
|
|
|
|
}
|
2013-11-26 13:44:00 +07:00
|
|
|
item.translated = translation;
|
|
|
|
emit translated (item);
|
2013-11-23 14:00:22 +07:00
|
|
|
}
|