fix bug - in plugin xdxf display of path to dictionary is change
[mdictionary] / trunk / src / plugins / google / src / 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                     _langFrom(tr("")), _langTo(tr("")),_name(tr("")),
32                     _type(tr("google")), _infoNote(tr("")) {
33
34     _settings = new Settings();
35     _dictDialog = new GoogleDictDialog(this,this);
36     http = new QHttp(this);
37
38     stopped = false;
39     _connectionAccept = false;
40     _icon = QIcon(":/icons/drawing.png");
41     languages=initLanguages();
42     _settings->setValue("type","google");
43     _settings->setValue("connectionAcepted","true");
44
45     connect(http, SIGNAL(done(bool)), this, SLOT(done()));
46 }
47
48 GooglePlugin::~GooglePlugin() {
49     delete _settings;
50 }
51
52 QString GooglePlugin::langFrom() const {
53     return languages.key(_langFrom);
54 }
55 QString GooglePlugin::langTo() const {
56     return languages.key(_langTo);
57 }
58
59 QString GooglePlugin::name() const {
60     return QString("dictionary");
61 }
62
63 QString GooglePlugin::type() const {
64     return _type;
65 }
66
67 QString GooglePlugin::infoNote() const {
68     return _infoNote;
69 }
70
71 void GooglePlugin::setLangTo(QString langTo){
72     _langTo=langTo;
73 }
74
75 void GooglePlugin::setLangFrom(QString langFrom){
76     _langFrom=langFrom;
77 }
78
79 DictDialog* GooglePlugin::dictDialog() {
80     return _dictDialog;
81 }
82
83 bool GooglePlugin::isAvailable() const {
84     if(_settings->value("connectionAcepted")=="true") {
85  //       _connectionAccept=true;
86         return true;
87     }
88     else {
89 //        _connectionAccept=false;
90         return false;
91     }
92 }
93
94 void GooglePlugin::setConnectionAccept(QString connectionAcepted) {
95     if(connectionAcepted=="true")
96         _connectionAccept=true;
97     else
98         _connectionAccept=false;
99 }
100
101 bool GooglePlugin::isConnectionAccept() {
102     return _connectionAccept;
103 }
104
105 QString GooglePlugin::search(QString) {
106     /*function is not used on this plagin */
107     return QString("");
108 }
109
110 uint GooglePlugin::hash() const {
111     return _hash;
112 }
113
114 void GooglePlugin::setHash(uint) {
115     this->_hash=_hash;
116 }
117
118 Settings* GooglePlugin::settings() {
119     return _settings;
120 }
121
122 QIcon* GooglePlugin::icon() {
123     return &_icon;
124 }
125
126 CommonDictInterface* GooglePlugin::getNew(const Settings* settings) const
127 {
128     GooglePlugin *plugin = new GooglePlugin();
129     if(settings) {
130         plugin->setLangFrom(settings->value("langFrom"));
131         plugin->setLangTo(settings->value("langTo"));
132         plugin->setConnectionAccept(settings->value("connectionAccept"));
133         QStringList list = settings->keys();
134         foreach(QString key, list)
135             plugin->settings()->setValue(key, settings->value(key));
136     }
137     delete settings;
138     plugin->getDictionaryInfo();
139     return plugin;
140 }
141
142 void GooglePlugin::setSettings(Settings* settings) {
143     if(settings){
144         _langFrom=settings->value("langFrom");
145         _langTo=settings->value("langTo");
146         setConnectionAccept(settings->value("connectionAccept"));
147         QStringList list = settings->keys();
148         foreach(QString key, list)
149             _settings->setValue(key, settings->value(key));
150         delete settings;
151         getDictionaryInfo();
152     }
153 }
154
155 Translation* GooglePlugin::getTranslationFor(QString key) {
156     return (new TranslationGoogle(key,"",_infoNote,this));
157 }
158
159 QList<Translation*> GooglePlugin::searchWordList(QString word, int ) {
160     QList<Translation*> translations;
161     if(isAvailable()) {
162         word.replace("*","");   /*remove wildcard*/
163         word.replace("?","");
164
165        QString url=QString("/translate_a/t?client=t&sl=%1&tl=%2").arg(_langFrom,
166                                                                      _langTo);
167         qDebug()<<  url;
168         QHttpRequestHeader head = QHttpRequestHeader("POST", url, 1,1);
169         head.setValue("Host","www.google.pl");
170         head.setValue("User-Agent", "Mozilla/5.0");
171         head.setValue("Accept-Encoding", "deflate");
172         head.setContentLength(word.length());
173         head.setValue("Connection", "Close");
174
175         QByteArray data("text=");
176         data.append(word.toUtf8());
177         http->setHost("www.google.pl");
178
179         wait=true;
180         stopped=false;
181         http->request(head, data);
182         QString error("");
183         while(wait && (error=="" || error=="Unknown error") && !stopped)
184             error=http->errorString();
185
186         if(error!="" && error!="Unknown error") {
187             qDebug()<<error;
188             Q_EMIT notify(Notify::Warning,
189                     QString("GooglePlugin: %1").arg(error));
190         }
191         QString text = QString::fromUtf8(http->readAll());
192         text=jsonParse(text);
193         if(text!="") {
194             text="<key>" + word + "</key>" + "<t>" + text + "</t>";
195             translations<<(new TranslationGoogle(word,text,_infoNote,this));
196         }
197     }
198     return translations;
199 }
200
201 QString GooglePlugin::jsonParse(QString result) {
202     qDebug()<<result;
203     int pos=0,pos2=0,index=0,size=0;
204     QString returnLang;
205     QString translation;
206     QString original;
207     QList<QString> partOfSpeach;
208     QList<QList<QString>* > words;
209     QStringList list1 = result.split("\"");
210
211     size=(list1.size()-1)/2;
212     if(size<=2)
213         return QString(""); // wrong format of data
214
215     translation=list1.at(index*2+1);
216     index++;
217     original=list1.at(index*2+1);
218     pos=result.indexOf("]");
219     index++;
220     while(result.at(pos+1)==QChar(',')) {
221         index++;
222         translation+=list1.at(index*2+1);
223         index++;
224         original=list1.at(index*2+1);
225         pos=result.indexOf("]",pos+1);
226         index++;
227     }
228
229     pos=result.indexOf("]",pos+1);
230     pos++;
231     index++;
232     if(result.at(pos+1)==QChar(','))
233         returnLang=list1.at(index*2+1); /*return when translate sentence*/
234
235     while(result.indexOf("[",pos+1)!=-1){
236         partOfSpeach.append(list1.at(index*2+1));
237         pos2=result.indexOf("]",pos+1);
238         pos=result.indexOf("\"",pos+1);
239         pos=result.indexOf("\"",pos+1);
240         pos=result.indexOf("\"",pos+1);
241         pos=result.indexOf("\"",pos+1);
242         QList<QString> *list=new QList<QString>;
243         while(pos2>pos && pos2!=-1 && pos!= -1) {
244             index++;
245             if(size==index)
246                 return QString("");
247             list->append(list1.at(index*2+1));
248             pos=result.indexOf("\"",pos+1);
249             pos=result.indexOf("\"",pos+1);
250         }
251         words.append(list);
252         index++;
253         if(size==index)
254             return QString("");
255         pos=pos2+2;
256     }
257
258     if(words.size()!=partOfSpeach.size()) {
259         qDebug()<<"Error in Google Plugin (JsonParse)";
260         Q_EMIT notify(Notify::Warning,
261                 QString("GooglePlugin: can't parse Json"));
262         return QString("");
263     }
264     returnLang=list1.at(index*2+1);
265     if(partOfSpeach.size()==0){
266         if(translation.toLower()==original.toLower()){
267             return QString(""); // word don't exist";
268         }
269         else
270             return "\""+translation+"\"";
271     }
272     result=translation;
273     for(int i=0; i<words.size();i++) {
274         result+="<br/>";
275         result+="<pos>"+partOfSpeach.at(i)+"</pos>: ";
276         for(int j=0; j<words.at(i)->size();j++)
277             result+=words.at(i)->at(j)+", ";
278         result.remove(result.size()-2,2);
279     }
280     return result;
281 }
282
283 void GooglePlugin::done() {
284     wait=false;
285 }
286
287 void GooglePlugin::stop() {
288     stopped=true;
289 }
290
291 QMap<QString, QString> GooglePlugin::initLanguages() {
292     QMap<QString, QString> languages;
293     languages["AFRIKAANS"] = "af";
294     languages["ALBANIAN"] = "sq";
295 //    languages["AMHARIC"] = "am";
296     languages["ARABIC"] = "ar";
297     languages["ARMENIAN"] = "hy";
298     languages["AZERBAIJANI"] = "az";
299     languages["BASQUE"] = "eu";
300     languages["BELARUSIAN"] = "be";
301 //    languages["BENGALI"] = "bn";
302 //    languages["BIHARI"] = "bh";
303 //    languages["BRETON"] = "br";
304     languages["BULGARIAN"] = "bg";
305 //    languages["BURMESE"] = "my";
306     languages["CATALAN"] = "ca";
307 //    languages["CHEROKEE"] = "chr";
308     languages["CHINESE"] = "zh";
309 //    languages["CHINESE_SIMPLIFIED"] = "zh-CN";
310 //    languages["CHINESE_TRADITIONAL"] = "zh-TW";
311 //    languages["CORSICAN"] = "co";
312     languages["CROATIAN"] = "hr";
313     languages["CZECH"] = "cs";
314     languages["DANISH"] = "da";
315 //    languages["DHIVEHI"] = "dv";
316     languages["DUTCH"] = "nl";
317     languages["ENGLISH"] = "en";
318 //    languages["ESPERANTO"] = "eo";
319     languages["ESTONIAN"] = "et";
320 //    languages["FAROESE"] = "fo";
321     languages["FILIPINO"] = "tl";
322     languages["FINNISH"] = "fi";
323     languages["FRENCH"] = "fr";
324 //    languages["FRISIAN"] = "fy";
325     languages["GALICIAN"] = "gl";
326     languages["GEORGIAN"] = "ka";
327     languages["GERMAN"] = "de";
328     languages["GREEK"] = "el";
329 //    languages["GUJARATI"] = "gu";
330     languages["HAITIAN_CREOLE"] = "ht";
331     languages["HEBREW"] = "iw";
332     languages["HINDI"] = "hi";
333     languages["HUNGARIAN"] = "hu";
334     languages["ICELANDIC"] = "is";
335     languages["INDONESIAN"] = "id";
336 //    languages["INUKTITUT"] = "iu";
337     languages["IRISH"] = "ga";
338     languages["ITALIAN"] = "it";
339     languages["JAPANESE"] = "ja";
340 //    languages["JAVANESE"] = "jw";
341 //    languages["KANNADA"] = "kn";
342 //    languages["KAZAKH"] = "kk";
343 //    languages["KHMER"] = "km";
344     languages["KOREAN"] = "ko";
345 //    languages["KURDISH"] = "ku";
346 //    languages["KYRGYZ"] = "ky";
347 //    languages["LAO"] = "lo";
348 //    languages["LATIN"] = "la";
349     languages["LATVIAN"] = "lv";
350     languages["LITHUANIAN"] = "lt";
351 //    languages["LUXEMBOURGISH"] = "lb";
352     languages["MACEDONIAN"] = "mk";
353     languages["MALAY"] = "ms";
354 //    languages["MALAYALAM"] = "ml";
355     languages["MALTESE"] = "mt";
356 //    languages["MAORI"] = "mi";
357 //    languages["MARATHI"] = "mr";
358 //    languages["MONGOLIAN"] = "mn";
359 //    languages["NEPALI"] = "ne";
360     languages["NORWEGIAN"] = "no";
361 //    languages["OCCITAN"] = "oc";
362 //    languages["ORIYA"] = "or";
363 //    languages["PASHTO"] = "ps";
364     languages["PERSIAN"] = "fa";
365     languages["POLISH"] = "pl";
366     languages["PORTUGUESE"] = "pt";
367 //    languages["PORTUGUESE_PORTUGAL"] = "pt-PT";
368 //    languages["PUNJABI"] = "pa";
369 //    languages["QUECHUA"] = "qu";
370     languages["ROMANIAN"] = "ro";
371     languages["RUSSIAN"] = "ru";
372 //    languages["SANSKRIT"] = "sa";
373 //    languages["SCOTS_GAELIC"] = "gd";
374     languages["SERBIAN"] = "sr";
375 //    languages["SINDHI"] = "sd";
376 //    languages["SINHALESE"] = "si";
377     languages["SLOVAK"] = "sk";
378     languages["SLOVENIAN"] = "sl";
379     languages["SPANISH"] = "es";
380 //    languages["SUNDANESE"] = "su";
381     languages["SWAHILI"] = "sw";
382     languages["SWEDISH"] = "sv";
383 //    languages["SYRIAC"] = "syr";
384 //    languages["TAJIK"] = "tg";
385 //    languages["TAMIL"] = "ta";
386 //    languages["TATAR"] = "tt";
387 //    languages["TELUGU"] = "te";
388     languages["THAI"] = "th";
389 //    languages["TIBETAN"] = "bo";
390 //    languages["TONGA"] = "to";
391     languages["TURKISH"] = "tr";
392     languages["UKRAINIAN"] = "uk";
393     languages["URDU"] = "ur";
394 //    languages["UZBEK"] = "uz";
395 //    languages["UIGHUR"] = "ug";
396     languages["VIETNAMESE"] = "vi";
397     languages["WELSH"] = "cy";
398     languages["YIDDISH"] = "yi";
399 //    languages["YORUBA"] = "yo";
400     languages["DETECT LANGLAGE"] = "";
401     return languages;
402 }
403
404 void GooglePlugin::getDictionaryInfo() {
405     QString fullLangFrom=languages.key(_langFrom);
406     QString fullLangTo=languages.key(_langTo);
407     _infoNote=" [" + fullLangFrom + "-";
408     _infoNote+= fullLangTo + "] (" + _type + ")";
409 }
410
411
412 Q_EXPORT_PLUGIN2(google, GooglePlugin)