Backport fix google translator
[kdepim.git] / pimcommon / src / translator / googletranslator.cpp
blobf15b5a03848ded1ca01ae613ce8cfcada9e3a998
1 /*
2 Copyright (c) 2012-2015 Montel Laurent <montel@kde.org>
4 This program is free software; you can redistribute it and/or modify it
5 under the terms of the GNU General Public License, version 2, as
6 published by the Free Software Foundation.
8 This program is distributed in the hope that it will be useful, but
9 WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 General Public License for more details.
13 You should have received a copy of the GNU General Public License along
14 with this program; if not, write to the Free Software Foundation, Inc.,
15 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 #include "googletranslator.h"
19 #include "translatorutil.h"
20 #include "translatordebugdialog.h"
22 #include "pimcommon_debug.h"
23 #include <QJsonParseError>
24 #include <QNetworkAccessManager>
25 #include <QNetworkRequest>
26 #include <QPointer>
28 using namespace PimCommon;
30 GoogleTranslator::GoogleTranslator(QObject *parent)
31 : QObject(parent),
32 mNetworkAccessManager(new QNetworkAccessManager(this))
34 connect(mNetworkAccessManager, &QNetworkAccessManager::finished, this, &GoogleTranslator::slotTranslateFinished);
37 GoogleTranslator::~GoogleTranslator()
41 void GoogleTranslator::setInputText(const QString &text)
43 mInputText = text;
46 void GoogleTranslator::setFrom(const QString &language)
48 mFrom = language;
51 void GoogleTranslator::setTo(const QString &language)
53 mTo = language;
56 QString GoogleTranslator::resultTranslate() const
58 return mResult;
61 QMap<QString, QMap<QString, QString> > GoogleTranslator::initListLanguage(KComboBox *from)
63 QMap<QString, QMap<QString, QString> > listLanguage;
65 TranslatorUtil translatorUtil;
66 QList<QPair<QString, QString> > fullListLanguage;
67 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::automatic));
68 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::en));
69 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::nl));
70 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::fr));
71 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::de));
72 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::el));
73 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::it));
74 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::ja));
75 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::ko));
76 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::pt));
77 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::ru));
78 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::es));
80 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::af));
81 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::sq));
82 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::ar));
83 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::hy));
84 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::az));
85 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::eu));
86 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::be));
87 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::bg));
88 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::ca));
89 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::zh_cn_google)); // For google only
90 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::zh_tw_google)); // For google only
91 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::hr));
92 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::cs));
93 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::da));
94 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::et));
95 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::tl));
96 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::fi));
97 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::gl));
98 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::ka));
99 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::ht));
100 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::iw));
101 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::hi));
102 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::hu));
103 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::is));
104 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::id));
105 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::ga));
106 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::lv));
107 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::lt));
108 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::mk));
109 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::ms));
110 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::mt));
111 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::no));
112 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::fa));
113 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::pl));
114 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::ro));
115 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::sr));
116 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::sk));
117 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::sl));
118 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::sw));
119 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::sv));
120 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::th));
121 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::tr));
122 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::uk));
123 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::ur));
124 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::vi));
125 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::cy));
126 fullListLanguage.append(translatorUtil.pair(TranslatorUtil::yi));
127 const int fullListLanguageSize(fullListLanguage.count());
128 for (int i = 0; i < fullListLanguageSize; ++i) {
129 const QPair<QString, QString> currentLanguage = fullListLanguage.at(i);
130 translatorUtil.addItemToFromComboBox(from, currentLanguage);
132 QMap<QString, QString> toList;
133 for (int j = 0; j < fullListLanguageSize; ++j) {
134 if (j != 0 && j != i) { //don't add auto and current language
135 translatorUtil.addPairToMap(toList, fullListLanguage.at(j));
138 listLanguage.insert(currentLanguage.second, toList);
141 return listLanguage;
144 void GoogleTranslator::translate()
146 if (mFrom == mTo) {
147 Q_EMIT translateFailed(false, i18n("You used same language for from and to language."));
148 return;
151 mResult.clear();
153 QUrlQuery urlQuery;
154 urlQuery.addQueryItem(QStringLiteral("client"), QStringLiteral("gtx"));
155 urlQuery.addQueryItem(QStringLiteral("sl"), mFrom);
156 urlQuery.addQueryItem(QStringLiteral("tl"), mTo);
157 urlQuery.addQueryItem(QStringLiteral("dt"), QStringLiteral("t"));
158 urlQuery.addQueryItem(QStringLiteral("q"), mInputText);
160 QUrl url;
161 url.setQuery(urlQuery);
162 url.setScheme(QStringLiteral("http"));
163 url.setHost(QStringLiteral("translate.googleapis.com"));
164 url.setPath(QStringLiteral("/translate_a/single"));
165 const QNetworkRequest request(url);
167 QNetworkReply *reply = mNetworkAccessManager->get(request);
168 connect(reply, static_cast<void (QNetworkReply::*)(QNetworkReply::NetworkError)>(&QNetworkReply::error), this, &GoogleTranslator::slotError);
171 void GoogleTranslator::slotError(QNetworkReply::NetworkError /*error*/)
173 Q_EMIT translateFailed(false);
176 void GoogleTranslator::slotTranslateFinished(QNetworkReply *reply)
179 mJsonData = QString::fromUtf8(reply->readAll());
180 reply->deleteLater();
181 // jsonData contains arrays like this: ["foo",,"bar"]
182 // but this is not valid JSON for QJSON, it expects empty strings: ["foo","","bar"]
183 mJsonData = mJsonData.replace(QRegExp(QLatin1String(",{3,3}")), QStringLiteral(",\"\",\"\","));
184 mJsonData = mJsonData.replace(QRegExp(QLatin1String(",{2,2}")), QStringLiteral(",\"\","));
185 //qCDebug(PIMCOMMON_LOG) << mJsonData;
187 QJsonParseError parsingError;
188 const QJsonDocument jsonDoc = QJsonDocument::fromJson(mJsonData.toUtf8(), &parsingError);
189 if (parsingError.error != QJsonParseError::NoError || jsonDoc.isNull()) {
190 Q_EMIT translateFailed(false);
191 return;
193 const QVariantList json = jsonDoc.toVariant().toList();
194 #if !defined(NDEBUG)
195 mJsonDebug = QString::fromUtf8(jsonDoc.toJson(QJsonDocument::Indented));
196 #endif
197 Q_FOREACH (const QVariant &level0, json) {
198 const QVariantList listLevel0 = level0.toList();
199 if (listLevel0.isEmpty()) {
200 continue;
202 Q_FOREACH (const QVariant &level1, listLevel0) {
203 if (level1.toList().size() <= 2) {
204 continue;
206 mResult += level1.toList().at(0).toString();
209 Q_EMIT translateDone();
212 void GoogleTranslator::debug()
214 #if !defined(NDEBUG)
215 QPointer<TranslatorDebugDialog> dlg = new TranslatorDebugDialog;
216 dlg->setDebug(mJsonData);
217 dlg->exec();
218 delete dlg;
219 #endif
222 void GoogleTranslator::clear()
224 mJsonData.clear();