1 /*******************************************************************************
3 This file is part of mDictionary.
5 mDictionary is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
10 mDictionary is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with mDictionary. If not, see <http://www.gnu.org/licenses/>.
18 Copyright 2010 Comarch S.A.
20 *******************************************************************************/
22 \file GooglePlugin.cpp
23 \brief Implementation of google plugin's main class.
25 \author Jakub Jaszczynski <j.j.jaszczynski@gmail.com>
28 #include "GooglePlugin.h"
30 #include "GoogleDictDialog.h"
32 QMap<QString, QString> GooglePlugin::languages;
33 bool GooglePlugin::noNetworkErrorShowed = false;
36 GooglePlugin::GooglePlugin(QObject *parent): CommonDictInterface(parent),
37 _name(""),_infoNote("") {
38 _settings = new Settings();
39 _settings->setValue("lang_to","");
40 _settings->setValue("lang_from","");
41 _settings->setValue("type","google");
42 _settings->setValue("connection_accepted","true");
43 _dictDialog = new GoogleDictDialog(this,this);
44 _iconPath = "/usr/share/mdictionary/google.png";
45 _icon = QIcon(_iconPath);
51 connect(http, SIGNAL(done(bool)), this, SLOT(done()));
53 http->moveToThread(threa);
57 void GooglePlugin::retranslate() {
58 QString locale = QLocale::system().name();
59 QTranslator *translator = new QTranslator(this);
60 if(!translator->load(":/google/translations/" + locale)) {
61 translator->load(":/google/translations/en_US");
63 QCoreApplication::installTranslator(translator);
67 GooglePlugin::~GooglePlugin() {
73 QString GooglePlugin::langFrom() const {
74 return languages.key(_settings->value("lang_from"));
78 QString GooglePlugin::langTo() const {
79 return languages.key(_settings->value("lang_to"));
83 QString GooglePlugin::name() const {
84 return QString("dictionary");
88 QString GooglePlugin::type() const {
89 return QString("google");
93 QString GooglePlugin::infoNote() const {
98 void GooglePlugin::setLangTo(QString langTo){
99 _settings->setValue("lang_to",langTo);
103 void GooglePlugin::setLangFrom(QString langFrom){
104 _settings->setValue("lang_from",langFrom);;
108 DictDialog* GooglePlugin::dictDialog() {
113 bool GooglePlugin::isAvailable() const {
114 return isConnectionAccept();
118 void GooglePlugin::setConnectionAccept(QString connectionAcepted) {
119 if(connectionAcepted=="true")
120 _settings->setValue("connection_accepted","true");
122 _settings->setValue("connection_accepted","false");
126 bool GooglePlugin::isConnectionAccept() const {
127 if(_settings->value("connection_accepted")=="true")
134 Settings* GooglePlugin::settings() {
139 void GooglePlugin::setSettings(const Settings* settings) {
141 QStringList list = settings->keys();
142 foreach(QString key, list)
143 _settings->setValue(key, settings->value(key));
145 Q_EMIT settingsChanged();
150 QIcon* GooglePlugin::icon() {
154 QString GooglePlugin::iconPath(){
159 CommonDictInterface* GooglePlugin::getNew(const Settings* settings) const {
160 GooglePlugin *plugin = new GooglePlugin();
162 plugin->setSettings(settings);
167 QString GooglePlugin::search(QString) {
168 qDebug() << "function is not used in google plugin";
173 Translation* GooglePlugin::getTranslationFor(QString key) {
174 return (new TranslationGoogle(key,"",_infoNote,this));
178 QList<Translation*> GooglePlugin::searchWordList(QString word, int ) {
179 QList<Translation*> translations;
182 char wrongChar[]={"*?&<>"};
183 for(unsigned int a=0;a<sizeof(wrongChar);a++) /*remove wrong char*/
184 word.replace(wrongChar[a],"");
186 QString url=QString("/translate_a/t?client=t&sl=%1&tl=%2").arg(
187 _settings->value("lang_from"),
188 _settings->value("lang_to"));
189 QHttpRequestHeader head = QHttpRequestHeader("POST", url, 1,1);
190 head.setValue("Host","www.google.pl");
191 head.setValue("User-Agent", "Mozilla/5.0");
192 head.setValue("Accept-Encoding", "deflate");
193 head.setContentLength(word.length());
194 head.setValue("Connection", "Close");
196 QByteArray data("text=");
197 data.append(word.toUtf8());
198 http->setHost("www.google.pl");
200 wait=true; /* bool - change in slot done (initiate by http) */
201 stopped=false; /* bool - change in slot stop (initiate in gui) */
203 http->request(head, data);
204 while(wait && (error=="" || error=="Unknown error") && !stopped){
205 error=http->errorString();
206 if(lastState!=http->state()) {
207 lastState=http->state();
212 if(error!="" && error!="Unknown error") {
213 if(!noNetworkErrorShowed) {
214 noNetworkErrorShowed = true;
215 Q_EMIT notify(Notify::Warning,
216 tr("GooglePlugin: %1").arg(error));
220 QString text = QString::fromUtf8(http->readAll());
221 text=jsonParse(text);
223 text="<key>" + word + "</key>" + "<t>" + text + "</t>";
224 translations<<(new TranslationGoogle(word,text,_infoNote,this));
231 QString GooglePlugin::jsonParse(QString result) {
232 int pos=0,pos2=0,index=0,size=0;
236 QList<QString> partOfSpeach;
237 QList<QList<QString>* > words;
238 QStringList list1 = result.split("\"");
240 size=(list1.size()-1)/2;
242 return QString(""); // wrong format of data
244 translation=list1.at(index*2+1);
246 original=list1.at(index*2+1);
247 pos=result.indexOf("]");
249 while(result.at(pos+1)==QChar(',')) {
251 translation+=list1.at(index*2+1);
253 original=list1.at(index*2+1);
254 pos=result.indexOf("]",pos+1);
258 pos=result.indexOf("]",pos+1);
261 if(result.at(pos+1)==QChar(','))
262 returnLang=list1.at(index*2+1); /*return when translate sentence*/
264 while(result.indexOf("[",pos+1)!=-1){
265 partOfSpeach.append(list1.at(index*2+1));
266 pos2=result.indexOf("]",pos+1);
267 pos=result.indexOf("\"",pos+1);
268 pos=result.indexOf("\"",pos+1);
269 pos=result.indexOf("\"",pos+1);
270 pos=result.indexOf("\"",pos+1);
271 QList<QString> *list=new QList<QString>;
272 while(pos2>pos && pos2!=-1 && pos!= -1) {
276 list->append(list1.at(index*2+1));
277 pos=result.indexOf("\"",pos+1);
278 pos=result.indexOf("\"",pos+1);
287 if(words.size()!=partOfSpeach.size()) {
288 qDebug()<<"Error in Google Plugin (JsonParse)";
289 Q_EMIT notify(Notify::Warning,
290 tr("GooglePlugin: can't parse Json"));
293 returnLang=list1.at(index*2+1);
294 if(partOfSpeach.size()==0){
295 if(translation.toLower()==original.toLower())
296 return QString(""); // word doesn't exist";
298 return "\""+translation+"\"";
301 for(int i=0; i<words.size();i++) {
302 result+="<br/><pos>"+partOfSpeach.at(i)+"</pos>: ";
303 for(int j=0; j<words.at(i)->size();j++)
304 result+=words.at(i)->at(j)+", ";
305 result.remove(result.size()-2,2);
311 void GooglePlugin::done() {
316 void GooglePlugin::stop() {
321 void GooglePlugin::initLanguages() {
322 if(languages.count() != 0) return;
324 languages["Afrikaans"] = "af";
325 languages["Albanian"] = "sq";
326 languages["Arabic"] = "ar";
327 languages["Armenian"] = "hy";
328 languages["Azerbaijani"] = "az";
329 languages["Basque"] = "eu";
330 languages["Belarusian"] = "be";
331 languages["Bulgarian"] = "bg";
332 languages["Catalan"] = "ca";
333 languages["Chinese"] = "zh";
334 languages["Croatian"] = "hr";
335 languages["Czech"] = "cs";
336 languages["Danish"] = "da";
337 languages["Dutch"] = "nl";
338 languages["English"] = "en";
339 languages["Estonian"] = "et";
340 languages["Filipino"] = "tl";
341 languages["Finnish"] = "fi";
342 languages["French"] = "fr";
343 languages["Galician"] = "gl";
344 languages["Georgian"] = "ka";
345 languages["German"] = "de";
346 languages["Greek"] = "el";
347 languages["Haitian_creole"] = "ht";
348 languages["Hebrew"] = "iw";
349 languages["Hindi"] = "hi";
350 languages["Hungarian"] = "hu";
351 languages["Icelandic"] = "is";
352 languages["Indonesian"] = "id";
353 languages["Irish"] = "ga";
354 languages["Italian"] = "it";
355 languages["Japanese"] = "ja";
356 languages["Korean"] = "ko";
357 languages["Latvian"] = "lv";
358 languages["Lithuanian"] = "lt";
359 languages["Macedonian"] = "mk";
360 languages["Malay"] = "ms";
361 languages["Maltese"] = "mt";
362 languages["Norwegian"] = "no";
363 languages["Persian"] = "fa";
364 languages["Polish"] = "pl";
365 languages["Portuguese"] = "pt";
366 languages["Romanian"] = "ro";
367 languages["Russian"] = "ru";
368 languages["Serbian"] = "sr";
369 languages["Slovak"] = "sk";
370 languages["Slovenian"] = "sl";
371 languages["Spanish"] = "es";
372 languages["Swahili"] = "sw";
373 languages["Swedish"] = "sv";
374 languages["Thai"] = "th";
375 languages["Turkish"] = "tr";
376 languages["Ukrainian"] = "uk";
377 languages["Urdu"] = "ur";
378 languages["Vietnamese"] = "vi";
379 languages["Welsh"] = "cy";
380 languages["Yiddish"] = "yi";
381 languages["Detect langlage"] = "";
382 // languages["AMHARIC"] = "am";
383 // languages["BENGALI"] = "bn";
384 // languages["BIHARI"] = "bh";
385 // languages["BRETON"] = "br";
386 // languages["BURMESE"] = "my";
387 // languages["CHEROKEE"] = "chr";
388 // languages["CHINESE_SIMPLIFIED"] = "zh-CN";
389 // languages["CHINESE_TRADITIONAL"] = "zh-TW";
390 // languages["CORSICAN"] = "co";
391 // languages["DHIVEHI"] = "dv";
392 // languages["ESPERANTO"] = "eo";
393 // languages["FAROESE"] = "fo";
394 // languages["FRISIAN"] = "fy";
395 // languages["GUJARATI"] = "gu";
396 // languages["INUKTITUT"] = "iu";
397 // languages["JAVANESE"] = "jw";
398 // languages["KANNADA"] = "kn";
399 // languages["KAZAKH"] = "kk";
400 // languages["KHMER"] = "km";
401 // languages["KURDISH"] = "ku";
402 // languages["KYRGYZ"] = "ky";
403 // languages["LAO"] = "lo";
404 // languages["LATIN"] = "la";
405 // languages["LUXEMBOURGISH"] = "lb";
406 // languages["MALAYALAM"] = "ml";
407 // languages["MAORI"] = "mi";
408 // languages["MARATHI"] = "mr";
409 // languages["MONGOLIAN"] = "mn";
410 // languages["NEPALI"] = "ne";
411 // languages["OCCITAN"] = "oc";
412 // languages["ORIYA"] = "or";
413 // languages["PASHTO"] = "ps";
414 // languages["PORTUGUESE_PORTUGAL"] = "pt-PT";
415 // languages["PUNJABI"] = "pa";
416 // languages["QUECHUA"] = "qu";
417 // languages["SANSKRIT"] = "sa";
418 // languages["SCOTS_GAELIC"] = "gd";
419 // languages["SINDHI"] = "sd";
420 // languages["SINHALESE"] = "si";
421 // languages["SUNDANESE"] = "su";
422 // languages["SYRIAC"] = "syr";
423 // languages["TAJIK"] = "tg";
424 // languages["TAMIL"] = "ta";
425 // languages["TATAR"] = "tt";
426 // languages["TELUGU"] = "te";
427 // languages["TIBETAN"] = "bo";
428 // languages["TONGA"] = "to";
429 // languages["UZBEK"] = "uz";
430 // languages["UIGHUR"] = "ug";
434 void GooglePlugin::getDictionaryInfo() {
435 QString fullLangFrom=languages.key(_settings->value("lang_from"));
436 QString fullLangTo=languages.key(_settings->value("lang_to"));
437 _infoNote=" [" + fullLangFrom + "-" + fullLangTo + "] ";
441 Q_EXPORT_PLUGIN2(google, GooglePlugin)