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>
28 using namespace PimCommon
;
30 GoogleTranslator::GoogleTranslator(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
)
46 void GoogleTranslator::setFrom(const QString
&language
)
51 void GoogleTranslator::setTo(const QString
&language
)
56 QString
GoogleTranslator::resultTranslate() const
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
);
144 void GoogleTranslator::translate()
147 Q_EMIT
translateFailed(false, i18n("You used same language for from and to language."));
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
);
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);
193 const QVariantList json
= jsonDoc
.toVariant().toList();
195 mJsonDebug
= QString::fromUtf8(jsonDoc
.toJson(QJsonDocument::Indented
));
197 Q_FOREACH (const QVariant
&level0
, json
) {
198 const QVariantList listLevel0
= level0
.toList();
199 if (listLevel0
.isEmpty()) {
202 Q_FOREACH (const QVariant
&level1
, listLevel0
) {
203 if (level1
.toList().size() <= 2) {
206 mResult
+= level1
.toList().at(0).toString();
209 Q_EMIT
translateDone();
212 void GoogleTranslator::debug()
215 QPointer
<TranslatorDebugDialog
> dlg
= new TranslatorDebugDialog
;
216 dlg
->setDebug(mJsonData
);
222 void GoogleTranslator::clear()