Some changes in xdxf dialogs
[mdictionary] / src / plugins / google / GooglePlugin.cpp
1 /*******************************************************************************
2
3     This file is part of mDictionary.
4
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.
9
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.
14
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/>.
17
18     Copyright 2010 Comarch S.A.
19
20 *******************************************************************************/
21
22 /*! \file GooglePlugin.cpp
23     \author Jakub Jaszczynski <j.j.jaszczynski@gmail.com>
24 */
25
26 #include "GooglePlugin.h"
27 #include <QDebug>
28 #include "GoogleDictDialog.h"
29
30 GooglePlugin::GooglePlugin(QObject *parent): CommonDictInterface(parent),
31                     _name(""),_infoNote("") {
32     _settings = new Settings();
33     _settings->setValue("lang_to","");
34     _settings->setValue("lang_from","");
35     _settings->setValue("type","google");
36     _settings->setValue("connection_accepted","true");
37     _dictDialog = new GoogleDictDialog(this,this);
38     _icon = QIcon("/usr/share/mdictionary/google.png");
39
40     stopped = false;
41     languages=initLanguages();
42
43     http = new QHttp(this);
44     connect(http, SIGNAL(done(bool)), this, SLOT(done()));
45 }
46
47 void GooglePlugin::retranslate() {
48     QString locale = QLocale::system().name();
49
50     QTranslator *googleTranslator = new QTranslator(this);
51
52     if(locale == "pl_PL")
53         googleTranslator->load(":/translations/dict_google_pl");
54     else
55         googleTranslator->load(":/translations/dict_google_en");
56
57     QCoreApplication::installTranslator(googleTranslator);
58 }
59
60
61 GooglePlugin::~GooglePlugin() {
62     delete _settings;
63     delete _dictDialog;
64 }
65
66
67 QString GooglePlugin::langFrom() const {
68     return languages.key(_settings->value("lang_from"));
69 }
70
71
72 QString GooglePlugin::langTo() const {
73     return languages.key(_settings->value("lang_to"));
74 }
75
76
77 QString GooglePlugin::name() const {
78     return QString("dictionary");
79 }
80
81
82 QString GooglePlugin::type() const {
83     return QString("google");
84 }
85
86
87 QString GooglePlugin::infoNote() const {
88     return _infoNote;
89 }
90
91
92 void GooglePlugin::setLangTo(QString langTo){
93     _settings->setValue("lang_to",langTo);
94 }
95
96
97 void GooglePlugin::setLangFrom(QString langFrom){
98     _settings->setValue("lang_from",langFrom);;
99 }
100
101
102 DictDialog* GooglePlugin::dictDialog() {
103     return _dictDialog;
104 }
105
106
107 bool GooglePlugin::isAvailable() const {
108     return isConnectionAccept();
109 }
110
111
112 void GooglePlugin::setConnectionAccept(QString connectionAcepted) {
113     if(connectionAcepted=="true")
114         _settings->setValue("connection_accepted","true");
115     else
116         _settings->setValue("connection_accepted","false");
117 }
118
119 bool GooglePlugin::isConnectionAccept() const {
120     if(_settings->value("connection_accepted")=="true")
121         return true;
122     else
123         return false;
124 }
125
126
127 uint GooglePlugin::hash() const {
128     return _hash;
129 }
130
131
132 void GooglePlugin::setHash(uint _hash) {
133     this->_hash=_hash;
134 }
135
136
137 Settings* GooglePlugin::settings() {
138 /*    Settings *returnSettings=new Settings;
139     QStringList list = _settings->keys();
140     foreach(QString key, list)
141             returnSettings->setValue(key,_settings->value(key));
142     return returnSettings;
143 */
144     return _settings;
145 }
146
147
148 void GooglePlugin::setSettings(const Settings* settings) {
149     if(settings) {
150         QStringList list = settings->keys();
151         foreach(QString key, list)
152             _settings->setValue(key, settings->value(key));
153         getDictionaryInfo();
154         Q_EMIT settingsChanged();
155     }
156 }
157
158
159 QIcon* GooglePlugin::icon() {
160     return &_icon;
161 }
162
163
164 CommonDictInterface* GooglePlugin::getNew(const Settings* settings) const {
165     GooglePlugin *plugin = new GooglePlugin();
166     if(settings)
167         plugin->setSettings(settings);
168     return plugin;
169 }
170
171
172 QString GooglePlugin::search(QString) {
173     qDebug() << "function is not used in this plugin";
174     return QString("");
175 }
176
177
178 Translation* GooglePlugin::getTranslationFor(QString key) {
179     return (new TranslationGoogle(key,"",_infoNote,this));
180 }
181
182
183 QList<Translation*> GooglePlugin::searchWordList(QString word, int ) {
184     QList<Translation*> translations;
185     if(isAvailable()) {
186         QString error("");
187         word.replace("*","");   /*remove wildcard*/
188         word.replace("?","");
189         QString url=QString("/translate_a/t?client=t&sl=%1&tl=%2").arg(
190                                               _settings->value("lang_from"),
191                                               _settings->value("lang_to"));
192         QHttpRequestHeader head = QHttpRequestHeader("POST", url, 1,1);
193         head.setValue("Host","www.google.pl");
194         head.setValue("User-Agent", "Mozilla/5.0");
195         head.setValue("Accept-Encoding", "deflate");
196         head.setContentLength(word.length());
197         head.setValue("Connection", "Close");
198
199         QByteArray data("text=");
200         data.append(word.toUtf8());
201         http->setHost("www.google.pl");
202
203         wait=true;      /* bool - change in slot done (initiate by http) */
204         stopped=false;  /* bool - change in slot stop (initiate in gui)  */
205         http->request(head, data);
206         while(wait && (error=="" || error=="Unknown error") && !stopped)
207             error=http->errorString();
208
209         if(error!="" && error!="Unknown error") {
210             qDebug()<<error;
211             Q_EMIT notify(Notify::Warning,
212                     tr("GooglePlugin: %1").arg(error));
213         }
214
215         QString text = QString::fromUtf8(http->readAll());
216         text=jsonParse(text);
217         if(text!="") {
218             text="<key>" + word + "</key>" + "<t>" + text + "</t>";
219             translations<<(new TranslationGoogle(word,text,_infoNote,this));
220         }
221     }
222     return translations;
223 }
224
225
226 QString GooglePlugin::jsonParse(QString result) {
227     int pos=0,pos2=0,index=0,size=0;
228     QString returnLang;
229     QString translation;
230     QString original;
231     QList<QString> partOfSpeach;
232     QList<QList<QString>* > words;
233     QStringList list1 = result.split("\"");
234
235     size=(list1.size()-1)/2;
236     if(size<=2)
237         return QString(""); // wrong format of data
238
239     translation=list1.at(index*2+1);
240     index++;
241     original=list1.at(index*2+1);
242     pos=result.indexOf("]");
243     index++;
244     while(result.at(pos+1)==QChar(',')) {
245         index++;
246         translation+=list1.at(index*2+1);
247         index++;
248         original=list1.at(index*2+1);
249         pos=result.indexOf("]",pos+1);
250         index++;
251     }
252
253     pos=result.indexOf("]",pos+1);
254     pos++;
255     index++;
256     if(result.at(pos+1)==QChar(','))
257         returnLang=list1.at(index*2+1); /*return when translate sentence*/
258
259     while(result.indexOf("[",pos+1)!=-1){
260         partOfSpeach.append(list1.at(index*2+1));
261         pos2=result.indexOf("]",pos+1);
262         pos=result.indexOf("\"",pos+1);
263         pos=result.indexOf("\"",pos+1);
264         pos=result.indexOf("\"",pos+1);
265         pos=result.indexOf("\"",pos+1);
266         QList<QString> *list=new QList<QString>;
267         while(pos2>pos && pos2!=-1 && pos!= -1) {
268             index++;
269             if(size==index)
270                 return QString("");
271             list->append(list1.at(index*2+1));
272             pos=result.indexOf("\"",pos+1);
273             pos=result.indexOf("\"",pos+1);
274         }
275         words.append(list);
276         index++;
277         if(size==index)
278             return QString("");
279         pos=pos2+2;
280     }
281
282     if(words.size()!=partOfSpeach.size()) {
283         qDebug()<<"Error in Google Plugin (JsonParse)";
284         Q_EMIT notify(Notify::Warning,
285                 tr("GooglePlugin: can't parse Json"));
286         return QString("");
287     }
288     returnLang=list1.at(index*2+1);
289     if(partOfSpeach.size()==0){
290         if(translation.toLower()==original.toLower()){
291             return QString(""); // word doesn't exist";
292         }
293         else
294             return "\""+translation+"\"";
295     }
296     result=translation;
297     for(int i=0; i<words.size();i++) {
298         result+="<br/><pos>"+partOfSpeach.at(i)+"</pos>: ";
299         for(int j=0; j<words.at(i)->size();j++)
300             result+=words.at(i)->at(j)+", ";
301         result.remove(result.size()-2,2);
302     }
303     return result;
304 }
305
306
307 void GooglePlugin::done() {
308     wait=false;
309 }
310
311
312 void GooglePlugin::stop() {
313     stopped=true;
314 }
315
316
317 QMap<QString, QString> GooglePlugin::initLanguages() {
318     QMap<QString, QString> languages;
319     languages["Afrikaans"] = "af";
320     languages["Albanian"] = "sq";
321     languages["Arabic"] = "ar";
322     languages["Armenian"] = "hy";
323     languages["Azerbaijani"] = "az";
324     languages["Basque"] = "eu";
325     languages["Belarusian"] = "be";
326     languages["Bulgarian"] = "bg";
327     languages["Catalan"] = "ca";
328     languages["Chinese"] = "zh";
329     languages["Croatian"] = "hr";
330     languages["Czech"] = "cs";
331     languages["Danish"] = "da";
332     languages["Dutch"] = "nl";
333     languages["English"] = "en";
334     languages["Estonian"] = "et";
335     languages["Filipino"] = "tl";
336     languages["Finnish"] = "fi";
337     languages["French"] = "fr";
338     languages["Galician"] = "gl";
339     languages["Georgian"] = "ka";
340     languages["German"] = "de";
341     languages["Greek"] = "el";
342     languages["Haitian_creole"] = "ht";
343     languages["Hebrew"] = "iw";
344     languages["Hindi"] = "hi";
345     languages["Hungarian"] = "hu";
346     languages["Icelandic"] = "is";
347     languages["Indonesian"] = "id";
348     languages["Irish"] = "ga";
349     languages["Italian"] = "it";
350     languages["Japanese"] = "ja";
351     languages["Korean"] = "ko";
352     languages["Latvian"] = "lv";
353     languages["Lithuanian"] = "lt";
354     languages["Macedonian"] = "mk";
355     languages["Malay"] = "ms";
356     languages["Maltese"] = "mt";
357     languages["Norwegian"] = "no";
358     languages["Persian"] = "fa";
359     languages["Polish"] = "pl";
360     languages["Portuguese"] = "pt";
361     languages["Romanian"] = "ro";
362     languages["Russian"] = "ru";
363     languages["Serbian"] = "sr";
364     languages["Slovak"] = "sk";
365     languages["Slovenian"] = "sl";
366     languages["Spanish"] = "es";
367     languages["Swahili"] = "sw";
368     languages["Swedish"] = "sv";
369     languages["Thai"] = "th";
370     languages["Turkish"] = "tr";
371     languages["Ukrainian"] = "uk";
372     languages["Urdu"] = "ur";
373     languages["Vietnamese"] = "vi";
374     languages["Welsh"] = "cy";
375     languages["Yiddish"] = "yi";
376     languages["Detect langlage"] = "";
377 //    languages["AMHARIC"] = "am";
378 //    languages["BENGALI"] = "bn";
379 //    languages["BIHARI"] = "bh";
380 //    languages["BRETON"] = "br";
381 //    languages["BURMESE"] = "my";
382 //    languages["CHEROKEE"] = "chr";
383 //    languages["CHINESE_SIMPLIFIED"] = "zh-CN";
384 //    languages["CHINESE_TRADITIONAL"] = "zh-TW";
385 //    languages["CORSICAN"] = "co";
386 //    languages["DHIVEHI"] = "dv";
387 //    languages["ESPERANTO"] = "eo";
388 //    languages["FAROESE"] = "fo";
389 //    languages["FRISIAN"] = "fy";
390 //    languages["GUJARATI"] = "gu";
391 //    languages["INUKTITUT"] = "iu";
392 //    languages["JAVANESE"] = "jw";
393 //    languages["KANNADA"] = "kn";
394 //    languages["KAZAKH"] = "kk";
395 //    languages["KHMER"] = "km";
396 //    languages["KURDISH"] = "ku";
397 //    languages["KYRGYZ"] = "ky";
398 //    languages["LAO"] = "lo";
399 //    languages["LATIN"] = "la";
400 //    languages["LUXEMBOURGISH"] = "lb";
401 //    languages["MALAYALAM"] = "ml";
402 //    languages["MAORI"] = "mi";
403 //    languages["MARATHI"] = "mr";
404 //    languages["MONGOLIAN"] = "mn";
405 //    languages["NEPALI"] = "ne";
406 //    languages["OCCITAN"] = "oc";
407 //    languages["ORIYA"] = "or";
408 //    languages["PASHTO"] = "ps";
409 //    languages["PORTUGUESE_PORTUGAL"] = "pt-PT";
410 //    languages["PUNJABI"] = "pa";
411 //    languages["QUECHUA"] = "qu";
412 //    languages["SANSKRIT"] = "sa";
413 //    languages["SCOTS_GAELIC"] = "gd";
414 //    languages["SINDHI"] = "sd";
415 //    languages["SINHALESE"] = "si";
416 //    languages["SUNDANESE"] = "su";
417 //    languages["SYRIAC"] = "syr";
418 //    languages["TAJIK"] = "tg";
419 //    languages["TAMIL"] = "ta";
420 //    languages["TATAR"] = "tt";
421 //    languages["TELUGU"] = "te";
422 //    languages["TIBETAN"] = "bo";
423 //    languages["TONGA"] = "to";
424 //    languages["UZBEK"] = "uz";
425 //    languages["UIGHUR"] = "ug";
426     return languages;  
427 }
428
429
430 void GooglePlugin::getDictionaryInfo() {
431     QString fullLangFrom=languages.key(_settings->value("lang_from"));
432     QString fullLangTo=languages.key(_settings->value("lang_to"));
433     _infoNote=" [" + fullLangFrom + "-" + fullLangTo + "] ";
434 }
435
436
437 Q_EXPORT_PLUGIN2(google, GooglePlugin)