qstardict-0.12.9.orig/0000755000175000017500000000000011023552371013203 5ustar alexalexqstardict-0.12.9.orig/qstardict.pro0000644000175000017500000000421611023552142015722 0ustar alexalex############################################################################# # qstardict.pro - QStarDict, a StarDict clone written with using Qt # # Copyright (C) 2008 Alexander Rodin # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License along # # with this program; if not, write to the Free Software Foundation, Inc., # # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # ############################################################################# TEMPLATE = subdirs include(qstardict.pri) SUBDIRS = qstardict plugins DOCS += \ AUTHORS \ COPYNG \ ChangeLog \ THANKS DISTFILES += $$DOCS \ INSTALL \ README unix { isEmpty(NO_DBUS) { message("D-Bus support: enabled") } else { message("D-Bus support: disabled") } } isEmpty(NO_TRANSLATIONS) { message("Translations: enabled") } else { message("Translations: disabled") } message("Install prefix: "$$INSTALL_PREFIX) message("Binary directory: "$$BIN_DIR) message("Data directory: "$$DATA_DIR) isEmpty(NO_TRANSLATIONS):message("Translations directory: "$$TRANSLATIONS_DIR) message("Plugins directory: "$$PLUGINS_DIR) message("Documentation directory: "$$DOCS_DIR) docs.files = $$DOCS docs.path = $$DOCS_DIR INSTALLS += docs qstardict-0.12.9.orig/plugins/0000755000175000017500000000000011023552371014664 5ustar alexalexqstardict-0.12.9.orig/plugins/stardict/0000755000175000017500000000000011023552371016501 5ustar alexalexqstardict-0.12.9.orig/plugins/stardict/stardict.h0000644000175000017500000000631611023552133020471 0ustar alexalex/***************************************************************************** * stardict.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef STARDICT_H #define STARDICT_H #include #include #include #include #include "lib.h" class StarDict: public QObject, public QStarDict::DictPlugin { Q_OBJECT Q_INTERFACES(QStarDict::DictPlugin) public: StarDict(QObject *parent = 0); ~StarDict(); QString name() const { return "stardict"; } QString version() const { return "0.1"; } QString description() const { return "The StarDict plugin"; } QStringList authors() const { return QStringList() << "Hu Zheng " << "Opera Wang " << "Alexander Rodin "; } Features features() const { return Features(SearchSimilar | SettingsDialog); } QStringList availableDicts() const; QStringList loadedDicts() const { return m_loadedDicts.keys(); } void setLoadedDicts(const QStringList &loadedDicts); DictInfo dictInfo(const QString &dict); bool isTranslatable(const QString &dict, const QString &word); Translation translate(const QString &dict, const QString &word); virtual QStringList findSimilarWords(const QString &dict, const QString &word); int execSettingsDialog(QWidget *parent); friend class SettingsDialog; private: QString parseData(const char *data, int dictIndex = -1, bool htmlSpaces = false, bool reformatLists = false, bool expandAbbreviations = false); Libs *m_sdLibs; QStringList m_dictDirs; QHash m_loadedDicts; bool m_reformatLists; bool m_expandAbbreviations; }; #endif // STARDICT_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent qstardict-0.12.9.orig/plugins/stardict/distance.h0000644000175000017500000000111111023552133020432 0ustar alexalex#ifndef DISTANCE_H #define DISTANCE_H #include class EditDistance { private: int *d; int currentelements; /*Gets the minimum of three values */ inline int minimum( const int a, const int b, const int c ) { int min = a; if ( b < min ) min = b; if ( c < min ) min = c; return min; }; public: EditDistance( ); ~EditDistance( ); int CalEditDistance( const gunichar *s, const gunichar *t, const int limit ); }; #endif qstardict-0.12.9.orig/plugins/stardict/file.hpp0000644000175000017500000000355011023552133020130 0ustar alexalex#ifndef _FILE_HPP_ #define _FILE_HPP_ #include #include #include #include typedef std::list List; template void __for_each_file(const std::string& dirname, const std::string& suff, const List& order_list, const List& disable_list, Function f) { GDir *dir = g_dir_open(dirname.c_str(), 0, NULL); if (dir) { const gchar *filename; while ((filename = g_dir_read_name(dir)) != NULL) { std::string fullfilename(dirname + G_DIR_SEPARATOR_S + filename); if (g_file_test(fullfilename.c_str(), G_FILE_TEST_IS_DIR)) __for_each_file(fullfilename, suff, order_list, disable_list, f); else if (g_str_has_suffix(filename, suff.c_str()) && std::find(order_list.begin(), order_list.end(), fullfilename) == order_list.end()) { bool disable = std::find(disable_list.begin(), disable_list.end(), fullfilename) != disable_list.end(); f(fullfilename, disable); } } g_dir_close(dir); } } template void for_each_file(const List& dirs_list, const std::string& suff, const List& order_list, const List& disable_list, Function f) { List::const_iterator it; for (it = order_list.begin(); it != order_list.end(); ++it) { bool disable = std::find(disable_list.begin(), disable_list.end(), *it) != disable_list.end(); f(*it, disable); } for (it = dirs_list.begin(); it != dirs_list.end(); ++it) __for_each_file(*it, suff, order_list, disable_list, f); } #endif//!_FILE_HPP_ qstardict-0.12.9.orig/plugins/stardict/settingsdialog.ui0000644000175000017500000002026011023552133022054 0ustar alexalex SettingsDialog 0 0 466 332 StarDict plugin settings Translations If enabled all lists in translation wil be formated using HTML <li> tag (may be slow) Reformat lists Expand abbreviations if dictionary contains it (may be slow) Expand abbreviations false <b><font color="red">Warning!</font></b> Reformatted translations may display incorrectly. Data directories 9 9 9 9 6 6 6 0 0 0 0 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Add directory</p></body></html> Add :/icons/list-add.png <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remove directory</p></body></html> Remove :/icons/list-remove.png <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Move up</p></body></html> Up :/icons/arrow-up.png <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Move down</p></body></html> Down :/icons/arrow-down.png Qt::Horizontal 342 26 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok buttonBox accepted() SettingsDialog accept() 227 311 157 274 buttonBox rejected() SettingsDialog reject() 295 317 286 274 reformatListsBox toggled(bool) reformatTranslationsWarningLabel setVisible(bool) 55 43 48 86 qstardict-0.12.9.orig/plugins/stardict/pixmaps/0000755000175000017500000000000011023552371020162 5ustar alexalexqstardict-0.12.9.orig/plugins/stardict/pixmaps/arrow-up.png0000644000175000017500000002273711023552133022453 0ustar alexalexPNG  IHDR>abKGD pHYs B(xtIME #0{ IDATx}y|Twd YLքl$Aqik}}DZlmVP}hEDdIH l a dg{ds;K h~O̹9s\`@d@d@d@d@d@d@d@*B_vedX.d pm:D:@@N3_|`X4 =DGlve+@^a4FjqxÈtbxZ8ԛPwZצ ߊ"p1TWWCdLz8tǶm%_Iu)xoYXXr#7w<"""ӺCt_ǎUT-a z@֭[_ȟ4ic7y³P 'L@~n.t:|y3W*#GiQ AtmRWIfrwDgyy(χ^j۽jտ&/~vTTEѣmu`l[wi`1DQKdd.IN՚xԐ=wt Պ Om×l @i&ig؏Q Q(VZ'{1^p&PֻCƈ4KJ*Q;lz} %rKq8!"<4ƺȜ~|ǘnH\7S3za^ʳΥ06t(n@gg[# >1M5@/*Mbt:#Zk㪮zLj=x/9{P[[+[y?+iw3?%@'#IPi^]܃: /@M%DQ*@ь)cH!C0up>|\mog=p\Z Pq̜Νq.^āa`pEDEF"2*S9/su(խֻܜd8III0]LdBN8(3h 3za>m*t:gz9]z ti1z%oK[Z 1<"7'|S "#{uכr+ lRH8X*EDHHkp8<#Фc:u[3f02(]S :ӦLAhhP p(\zFVMM JKJ "ͅfѣGqtM7wI5|q< Z8;qq-U!G,H !..΍FtT{<0ZwWdn>{챞tq\t wE'dW` OڗIR!΃=BCCQWW"s` ,񪭷L͜MD%6AWP}T3Y!Rp^[?aa!QUU˗.aРAQ,ITaZhkkaq6UUUHKOKod2 /ǩqh\ `,@]]J 5ksU8qK |Y!tIfbcp:ApgYǥU;w'R'rsrq{]4e*%)%wC|'T]EEhǩSp%#44Lp摇Q=2=G 2R@fVcǪo 7"JAr:D]w˗{tYUk4ܸ=p|‚UwUɓ'z]N>˗d vp/F6 nQ@ 92GvIvS{:-\b}"BHHW2wo!mI7447h.s1;F)Sڵk8r2d |+q/3&3>tzzBE"(A+U;}S`xF?JѰC:&kfWaF3Jnǽ܃wUSҕ/pe$ NhxEe:$cq-- "*}m*%=uF#GfTKTfٜ6(-)n3y/]xz1.^gHHHhmky!@x ?Gef>K@Tӆ CxXs/Ǖ+5HLL`PLF)HA.5$K{aZ1iDXq]wSx 1)z}'mKgʱg#,}а0E@k/~!nJg (/+CgG'rssn*J?99ىҒR1MEQ`2"$$' =TpQ:Qxn~11ѽI^7/ͣ+ X,+/CGGg˫^vhot:̜9+V{ II/@ ,z~,VR >|#( `Z%t~S]KKE:%zN++GG{ƍWBXh(nbK/a1hhGYi),Nxr \0bIp_{hxx&]J狂g8n`0d ^|Wm:;-_^6= k֬陫W^~GB[[JKJi]6wV߁ Lp7Nr.Q^ops( Qbj21:%d vKtzAwmjކ#3 222چҽ]J^QG}* &}95?1 ^ 3J6L,tjhkmCƈ }u-_%22kVFFb_Y9,N {;`4zhXU5k8G- 7V vsv 8I%fChimEzz:֭[hwƚk0|p`_~جVG\2,.uM!$]l؟?̀'^J1MMMhjnf@垣ul8| ZZZ6l^[111]$&&k_]Æ`<kaVHpbăp ysyL%!!6vYM0mv4Ͱڬ ;Kh%z<%8Q8dzurTVTIذ~=իW׬ ׬~c\z5KHH됔&s8!@d %6449V]CA ({PC N4aZ=:oΑp8PYQ&3ƍHJJ :lތFEe F'`B>*+*0{l޼9MLLkk!!! 8{u}='͆fX,LivĹyUYcPfq\{: Gl6#!!ol|)))AK~6fCBBrrɄdttvl6㳝;Q}:b|3ܸqMf$&&v$Kz!NJ@ Ǿ}bhTTv-hkoCNDA@ձhl4cp`acʁض<1c"+;'_NCl7:'۶aCqKJJ ֭]874DkFN!8.@3EDd$M 錈3c8\Lʘǫ؀Ac͆+Wbٳڊh"etMBDd܂zlh :::iSO-HJL jjz,tgI(/+>@^r(\׫|!@E>u _Gzzz?w/O 1cF+.c$qhl4he%ك"1el߾ hinAl\,l6{Rf-߫MFNHx$] UU~"#"a1"(?|!>} &yy6'_N mx ` 5̙3.۲Kt]Z{rKU2I( ЏG#ganh@tT70j䨠th}}=Ν$degh2 u5 `0 dجVfD AaҤIv466 UQ̹O kYiY` :h]]=gЀH=jtP߹s'()-.$caQ.v}M1,:ycbk׮n:zNTT~ ̍fX, "N֕MGޒ*ѺP{>w7n@XX֯{ AzAw@D>YхY}*z99οfD ƍիګ8u,{fbn,qfaƩlgϡzLF֯_:JlذGcc#Ð5> qq|P^gttԌ:|8{=0Ɛzƌ|NO%/^g4k("f3؏FHRRrrr07a1x`}/3#>+S5  ]%՚ɈWWAaaa@o޲wpa ddcD<3HmTpY792yy0 8ٳg{QhAAV&/]Fjmܼ;9^yV´iV,Y}6 qBxxJgx/P$ߑNfl.\EOHIIAFF>x::ڑ6D.9ya4zĩ.陥WP0rԁzQQQwUU'`0i$ת{ l!-mF }^ݎֵY3^ٌ E^^W^y<&"::J.%8ڷ{瞿E 3@Ta4 8r0‘|~kjj2!{|6UG'<4plРACcC#jkk(=F z-U\ǩG4P0ߵs(@aA@GU<|g9,4F (+/Cjj*Fft;CC>5o&3?> PY5m& ))ٜ %8u$ jrO裏s"vJʚ6 ]>7GO'Gx;"<!!z444bΝ5jw#>ӧO#$$cƍŰaCŎkMI{ǯ4搓y$$& 2" 8>CaС~س-c cǍСC* g7,~^?$9mcb@ˋ zΠ|<.^h]ΦMc1OHZvorw :oN Ƚ*\/=zfzӧOǼy`X1#GgOOz{~%K҂fx䗏\_g@2kk6Z'h^ph^i]v}eӥXqZ1i"ޅpmvW;~h_mF>Һ2O to: ҫ5^n3Zf.)wCo4}Q? uD~JZWuobx )2_MA㪴?}{0 _W;j2~CgroȡƯՌϭbwv&z_.CZiK\Aʰdi7MD=NAܗ,-w]z¦M'=d̞Ua^fd1[N`IDAT!0OT#$b ^'[f=³F\0o] <_Ҭ'1<+_r._xwT9ei3!ki]sʴޗSr߫j. `ؗ=zi]vڗzKfՀ ~TiJfi~"[mO|KE J[6@>UGϟ?~d钻_4k{޼EyR>wgמ3*%Uݎyk7+<]0o>/7{מ3=/''.x$vAkvG!\ڬW-Wkj|uJ˕uwMTvu4r @s^RwSRZdȌr_6чEEo "NT-J42VQd gNmt{X :Qc7ՎS)||Q#y0Cr/N*Ntu֑Ar>֑̂@x cԫ}W@> abKGD pHYs B(xtIME #E< IDATx}yx}$@RD|R_qj׶Vnnw[{u44i64&Ol8%Qmqb[-ڭ[)IM@̷ `%{*CiG:`:5k@$v[pPY(3>Bg>v#&[l`[`xM8f7S*$v; @`EqAHBN/#Y'b7 2򲹒Rt ?s 8=K3 !t䄙iO@.>0ˉ@?v|C%&<T^5/ϡ@&Sޓ)0'7f:L@089t9"Ț̫&K o [o&m*/JÂA>c`s; o](1=GLɒ)5P~4;'28bK2g/="z~`髊 WIJYw?L+;%e.zϓ\Y"!fSnUAK 'Kk~6B UG#]`?' 07b׉G )Gk@$8  Hlgc(Εhj|6f^sBY @bfNx y?ʕV@JP@юfb!ee:X'Eƀk1 Y̾tȈ']w+6DҊ&mpu.)&7khʠ_֙ `1L|%w|d0h#e} Ÿ֝'fQk`n4xW_ 5*7n@uG 5ÿy>2u@yaM!=G,, dԶ{7EoNC :1{ٕ>kB(vf8>g0R]=ug1^ov:a@d*^JZca:ƦfS.DUSѧg?\^4mUtXtPtϽ A~|c<׏?0( {b(qMߟ>dL@e-`-Y)D4JJ`ٲdhL>&*byy~؊O]ukӈu;&0>Q5;hۉZq؁d*nj@]wCi47_ `w4xfWr#TyF#˵oR~-]nmT_ukJ}&0y޾fVǝ2p<~x>K)?e5OJND[T P[)Ɍ~(Cwjuu(ٰCB=8X*Ӑh1#Gs |0l&>Tlg.!81Skܐ k@m la#J+M\Uu.R~Pxgކ-E*UJ([:Rd%F< "DM\ D%H pY,4_7;\:>8qT-̀O`;~l `:АV@ɍ7b/8vӘCbLwc~-qKԤ |0UV}^Xd]._=!Ѽvk@EEPY|(`ʗPS ?Z;_=VנluTq>Sf_cw&Qx?1O]̸><ڢ*#|3БpUU``2Oc,[[3?\qqLcn0^~|U7&y|.H/`n |0U+A+'1Q@`-CEMMQJ8==3.#jtT5*R{g +{4c<>/Ĕb{1rA: V*ޏ/j0ajY.IsT[;7e`lnI8aF?嬁/#sCI݇twyo5(wNtd |) |1M7Cc#bf>tͪksN InyT ja2`^ԩl/FdCT $EIЛ#'NOѱ@Vwb/<ܣT#"a` Y8d)\ema! յI*{k\ߏvAL ><uU(9"Ѓ}x@Y{[R2TV*L0껾6 P0< U2;:V^vL9 O9mWjnnFǁ(u|0WVI3z!Pp@g*h֑1O +dлkgnI0gQo**aknPl6g#ۖbk= bJ ^vl/.z>EfRQW9/ePc*WlRQAR]xye5C v*AәC;|c%l-j_`-|hKV>n[ 8L1Cu5g$JzLZ>]gJ6l:NwNAl|!+f~Jږ+R^wyq(jy Q&._4͞VlM(["ܙC%P9Բ.|xhNR+4 B!6dH<d;"r;g[$j v@r::رޮ\`HO`v:s.l)>& "|f3H@ 7fz*.C٥0idk{htb67iAM11VƑ.lmIZR獛ZL}i <e"(٘}/ ~zwiokq&^g( SߩHLaJ_"2i-AOi aoi}~؞%XT𛛢v\c|F BHt37X qJj'' :Uax ;`onT\ [[`u6 aTOFW$x LMBky8ÚT}6&s89  PQ/Z{qS}2߇Ѿ7G`!wuzct_OM_P-y*E5; =67I@CkAYS>zo[RJNX'4V$Ԅ[ Px/q5Z"X?6 azi,\Y*ID~,xгk">/X' rT.R13EEMe RoV? atB Ie('ugTMU(kSޮ.!&y( ֆ:'%MZ\81^ g:`L}&W3Le ^H^ݷTÔ+^|ٶ/O_;aTv߳PŒacDq1k`E1o&J:(vOB8_~o` |^fGSȼ9[kvu/x0A2&HZx_r kuϐT |;3%H~YS=Zܩr$D OXqVl`v|>~e9ddWVe@ {KXƛ RwM$c َD^tJo>ŠIJ/_!DpDq&c0av,8R*Ap#ގ={s~ƍh߷_̠[#+yQCA,X(J2:X:@oRC8$:>/D9!}!q+^~2Lw-& \CqDNqPt泂M5"YrgybP/" a F!䟕 kCǡ_TQ(QH}0Ax\Ct?@p8 8K|߉3Vw" aݲ Lq3>ȅg2dFt6ۢJ6~ZTbBM13<<ɠgAxd! dv\{K"Y,D" !<Υ܊/PZzY2%?js0=4$Tqb+h0>Ppypc}Cq۝w\Q.gKLa 2)ǝ̆ley0F\Ò{"݄gk@r_" jǵyWFYD 'gpcnʼn+> CsG$&oVGIK$8C2Y5=8O$v\pJp\£C]v\/8~D6Ԋ;ӟ.9S.7fJ=Mk udyRܟf@Y)X!rsvxV':I#}Ki0]++ Dj`dlc}.5>g:ޮv\% `5$izJ;}i=}7D]SDY. w_u=۶gܒ`Yl2L {X P6 ΂z  "|~]P-=$?s 'ѳ}x,z妲dFwjD ɖq'F)PHmx+~ _櫹۷5" IpRf…Y#&l.Ui/&\bAd94=ms6z "4;u>=`*;.\ Hnx+>}XT/ z]ִA/UD,F`j@62?@#,:ؔƳ~l1 ɓE KivFL7rݷl8H;NY>;>aF#Ǩضmo˸q`z`PqCq1;夼,VZ؛`mKȣ8S5YW1).JL,c/(@ۿlqo66lu7֫F{;>~deOKZ(,@ҽ}~xsf3V9mޜ[%jikVf;`oZ$ЏL ! az6g<0ӍA$.J/l`=uW$VX[ 4D4\Hnf`0moĤNm/~z8;RPQW~v=9z4dF,egd_J8?NiћK6Ȏs}[|CM SY u7K~a^ r@\O}KI6DunU9'@z&YeS{}Y#.HZq%, <6?sϋkpЅͤ%}N5kIU֜ ) Ӭd @i#%vv ,g྘n5kE[ , كֆYwe/(GUi1L5V 6%fP baxfdZVĪ+" onNNSRh%➹B,b(.Fi%_nu7j#S >_Jʕms}f_r~{s~UzҬ֦ؗ7 0qB \C~n5+qjoE#A ~Le: `P]6@g*ҭf%Pվ"IvgGO?Ao XobBJ;n#4)@`a9<ӲsZV>ABɓT=Do9W`q9v;PRe e q:VRf}8?_L kc}VR?X(K9~ ,||{d, r[@!9#~UTWG89Mj5 ħf8_} ''Ã?況[VKmݛj'Pd?QxM-N,zMh01 f Z| OlcA`ғ|Ūb &߫@K?' 3)? >|c͡6g# EzZ3 OB~?Lf Vv(=U䢿9!Ȗ{FUc\ƌŏ G!4O&r> /l~_ 'q{F01uvW4b>OYW>TsEߑ<?ٻ. or{T@֚/Eu21uDԕ?6 MhbYCK-U֊\&]޵@+?a =U+Jͱ{߱Yu=@|u%6uL؞7`/vvv/>-I/ld׶ρ pUǞzot/l@10Uk׿.,d鷱[n9zm@B-b{=|+ rk2'< j uxo4+q` A\v61^n/A8Pi$abKGD pHYs B(xtIME $ ^6[ IDATx}yxULs20@LHU~Q2O[^[Z>QT$sCFtN_{ 1KH{AX2¾2N&/\Nt1>?7 ஻W_FG=4i"n{J\P|DoW  hO?QZf=@I=;SLQPTME"ĉ(,.c[aӃ;wttɻu\\=*27-\ؘZa|l0b5Y_<`b&^=bcwr{{w:l F9s_aK_R݆[nFDxks}ǘ^Lj7KI3v\5+w;PTT5Ր3ڵkױAӦek Q;{ݔpה%Z{J \\bAPX\:/S/wiTFi^'%"Da񘓛}7ߨLlIeyxR|gzvLt5`ȑhii1 =g"8NbϠA 񌛸~ba4%øT܁QRD6(faߣc@zڝW͛grp\9&{`UC9 ^ q13et5U}5|1`<'YT@U o>Iѣ곃X G:@z7LCiyoVh&Ib"X_`-Jq zB@ 74jAx~|`7BZ4EevMNIVo)IA4BߙH6iiiÇ%PE+?="JsS@0:!cLj$X}}<1?tϘ wͽU];.n`~[s$?BU͆ήN I&YYYɮ h- 4[,zǏ3ͮ11a#{Rơ`aZ 1 {nLIo3wg%E 7zq%K)u&G@Ƽp휞t:NH@*)? ؚ7MHOuLP?Nf^W^Fʑ(`X(1c> e[?P``Lh%vIKbUo7?D. $%ʰN"\VµǻPAt<$evQ8C1=`!ŋc z3g8u2ueoͳmU!VUǃ"$?"(CEe=esqf wn "/]DzmT 7g^uWYʒU ļPw8QWW'fa"Z!n&nK$ p&}rS!n]JaV됰<Ƃ) $0#Ȱb1hhh˥m爖UnK"Ǝ.q11ǯ یѣBxx8SRɽU~xȾpme@[[UE{{;"""3ҊԂbje [o] *ѭ$ǣ!8vő#p@@s }-p.5Z*o3 2AUb[☇c8s4*T#m`(+TyRTd%j$pupK9rdDoIǾN?g dk0TVV%44#&6:yJ*aɈ r5$uYQTX=Ė?r |HgN˗b n!e%ouWNp{vݿ~Oy?w'qx1g̙3SLAaQP]uw{$G+I^BDjzתA|foߎgHLLĄ gϗhlh`@,g3',=D})Di--- LۉI 6 zAB&555xpM7;?8{,Ξ;Ztww#&6Gz}fC4\`5福$$p`y9V) 77;x'O|7GXX"#e=GhIp ҒAaIS Y8ða^0⼸Kp`9cX;o11(..Fss3jkk ԗ/+UOkFo~>D9b4'D܌S O}?BCC!*2 ^Q}Ou|CpTIqޠ0)S687AXH#",eep ݿ +WT221m4,?BmM /^٬IJϦxHZ)AzǏGlHJJŽ;;{b!996 qq |28جV8Ѫ"XKJ L:z#Bdd$hGiI N'N_N5fw~ 6DSSa| ԰^RK3wTDQa/^{gCll&333#MMͨDMu5T^[G#\\TJ p%yd`2$c ى `sρ8v6󘕝 0rH A' MaBqq :0rꗿq$ˍٳq)>} ;YeaYE)ɘ~IaIҽT̈́ U< mmA``sE 趸^twD|~ŋp(/-fc]uo xsgc Ն?[{{;._pш?=`2u"nZ.x"_#%9Gk F#nZcQXX <"P C̽ue$ E ŭ!o466-SO>|PJQQ6lÉ & &6C{ mAJ`iw(t_p8mAtWGTT6;Z{nΜdҤI[ph%.VUfW\)/cLuIcPqioR>ISt:\ӻ2͚}K"&'{,u#<" e8uTP$%MFWWq8A9 Opi 'OlӧOcŪhnjF9IS&B Ϫ<ǹ]~d;&'MF9XzR^&L}K"™3gPVR.ψ PR\3O@ޥxw1~=ٳg|r455!&6)3RX)H=5%qP+s2Tq<)IFcSΟ?A6 XxcĈhmkCqajk`EQA!Z0bXvm߷Q_8GsV8$0_PS8SMEtt4.5`}BdeevaEp88C\+kz!jè<ʵ_h>2,UUUX|93gI>iuU!gƀ3&1RF`-qx_&ٳ . 8&OXh1PTT֖#<<8x ._pl۶ y$8T@]]bb̘6L +w$Dn4ช}{;@#ֵuxZ,뭙A.wqvڅZ(/;Z,9s&>#qAomm-X uuu0͘A|1+Zݓ1XC6E_\O҃2ܫ0-y:"##Q]]uA'F¨?akS[E\CىI&o-CxpV\'NDDD822\ʕUWo}#JJL0iQ +x qv&^̕z3umF8`XQZZ KiiiL&U!bC=2 {VBCB$`*b( 淟/B ٬)Ą4L&ᡇb*_(/CɄY Նjf ˎSu9(yz Ǖ:DD Ezf:L!&GL`XPZZSBq3{l+43O-yYuW}+%%ڬ={6x퍠K͆>|LFv%羅y)$7A*l6=C]&~ͪ)+&,< 0 ߿kXۗ7?ncݺu(χh@vN65yGZdoavF{E|9X!W=jiOJY0aaʄhľ}~aݎM6`00+'8ٺC w|O/((ɞH _?:ϗ,ш8̙8s,,Xd//Ė-޽0\ď'm1(&jtum09`jړY0DȈHdfe@cϞ=زe- `[端70+'QQQfa]K"r3)EEurf#) >3zF9zZ Jn~}2&1!d9'D4|Y5=ìFhhHbbcP[[ǏR}=naf$`a'@!;'11/'^͙߿iW*++Yn^)"3 ٬d1AM;ƦFɛp/tqq16OR.G_~չ+}ٹ3hRгYȂq"lFm]VV ^/ v} GvN||ig=90?:"r;էRƉCVVxLJlw^{5|Cѯ7߲&롌v&HDVicq=!a$ڧ$Bd9rI[:mOz+ޜ T ʋRRk}\DK7^ O>|bSF -ܰa7(vg͟[K}fau6l ay暈<5wMt /nް),HAВޙ0vw}f޲_hkmJ(>FDV xp+[^x0llܸu -]nu{A5Dw@ڲn˱+}&~;v0vY_|\{mժUW}_~9L2<`LR=w﹐{['" g`YM;}~A|U ~'ϜĖu[*3 _Y0aGp7o |[^z[ kT7]= e_^zi{㱒 d? ^߼ns5NNyէcl=V:%a`>Zk~/$JD?X~'?ēUר}ry#ߜD9"3g7CrxO8.QAV :Rrԉ>{LdϹ@L8wh?:dʼnc7-*2z^8ybX$cB):ZYoYk,]5O|Ero}Mw]9Bs*  wPBdHH/~AoAAă)U i8AdQBƘSn5k!MخF|$^k"l c>/σt|vR0ҫ4NjT5D`2dAz?ɨ@xj>=4vvt?Jª󑘜W)|鯜A$+g pbp'+Ps 2d _Cb"_*A-IENDB`qstardict-0.12.9.orig/plugins/stardict/pixmaps/pixmaps.qrc0000644000175000017500000000031411023552133022344 0ustar alexalex arrow-down.png arrow-up.png list-add.png list-remove.png qstardict-0.12.9.orig/plugins/stardict/pixmaps/list-add.png0000644000175000017500000001537211023552133022375 0ustar alexalexPNG  IHDR>abKGD pHYs B(xtIME # fpIDATx]{ř}y?5#AQ4Y%p=Q1l6FyqbA$&ٳwr4nr5FTD bQ 30v}}uWW;3SVw}Q@JTD%*QJTD%:kΜiDt:CdM A\c:pa"@@f̌_[QJM&6<0;s ^}.b3v3/ђq-a2"`1Ԣ>e6R ;詘)|o>aƵ ,96Q OԟeDo2a14K/QI"3g 7X QFb9g~O wl߾$8kNDa9~ @e@;v>ܓ%Ag~ 7zMM5ЀƆF!H XD0883Dqtvv 8T@;/>̳%Ymm3%}\x&Nf477eR3<:J#bŁwBww0$󭔌_ߍ={@2{@ /~,5.c; /<¬>Y>9fHcؽ ߡ|[ 2U۶m@k{ fO³ =lΚX,™wVSh_4ص{7^}5{c~Nx޾XPa٘ڊj:DGx ~uzu  % l +s#B+ 3ui8yK `>&Ǟ^ع{q=R_$ X'r {zUkjjp…8yʔw&];^x=xeU[Ǐpt}ヒ;wرcVBy'cb_`Fu}㿑<}4|ҥf3ҟSzp/~crh3RbH;,̨ŌiۋN ?u1|睧͟X5kra``_L9P[ƳGtuuzꩂ:KiJֳ֧j[X -Xi:2W?*_zR柷׹jkqх1RJx\U'8Ւd0TyȬp1c/hwb2{ e$ 7)XK y'553.EC}X2XJ0RJHcl]Ē!%Cr\?wH)쬳KfcE)Ri]{X,>E-XuU;9ZZZK.A"Qfa”Gt2>}Hi0=dm'H`cĉ1XsW\w\@&R9z*.XZ2˸HLEkYzkKK=g/S/a)Sl2N\vjh[B>JD1JϒY=)'c޼6)j+ygM@Waz0-YGHe˖pQ"qh~IhfX;chE& #:1mҷ̘ڊ 'MA|Ĩ#vN:i,iY.ѦV]^x18nN}27Hg"9R֤Up Wr*vZJ;3քK:jPG1qa9zP:sP1K"ΞJXQ!-*'Pl7>ox;Z꣏.. \ЃY:{6b&{ UW]U; )btu6f$jjjɶD9}K%&OAGQA-Pmd$2Q2 4Vuu58t~ Sl# /> պL?As wj>>j 쨷hWk"̊,NI'iCjҕW^9c@m(cqj" V3gV&Hv* i<%k+k{d7AJq! aGKg0<4(3ҖvdQ2s+vܡ.Zd0fL}r KꋆHޠƪ"7648`&3&uL H3A@% wB-#u0~|zsQ@ /_n ?ŠsTc8S1)ӥL ՓvX'L9bf[aͺE,6gn8;Jɓ'ÿR3|fYUe~6,@BܙQ;' %(3:]v/;S9̈vSp1@f]w"MaMcX ͓&|#M\2,'N.<5ͪ-pUmwęPu{~3~ðǏCYYYEGT$prKs .`Ʋ:\5XEXh]c ĞB%HwlDZ8a"ρ&_(,YQyD"1cxjt.kOjy^K]2F$6 * s1`)Ѐx<@A+WN(Hø@7D[4(ѲjU; dzV! a5:q)?`:ZRPcСC0̡kl* f U!dcc7' aCfxA EHp 0+%ЈÇgCL ZF/l764 /l_͚DPz!w&-f{%-]n(q (-)ls qa, n19S0UdA p:AN@t8o^ͣ;Q^iW5!dT;5 vnCY\=T8V`+W6E&e(N֦Wttv[Z&zrW .#ڈj:yo"!3uXϥt;C!lc)MՕp>r n "i'^ փqrCRT }lv^U5ftoW"Q%x2 Ov"-q-7Vi °}zVC.r+9̋ `+*+-$tqkLM g&Ҫ "!`xadYy9l!@s4tٲSPLXth|@XðA,AK6b1@ ðX, 8~7pM z'|<`BhA2!db+ j׾<| $,sҙ+wuuufxo߾T2)94tx8vӞӉ1m4-R;֓!_{g(L0ָG-۵>Rd=};9+ޜ0$iԎC"@==i3uF,%zzz"c 6gV>Q#ؾ"[ea^nE4mQɡ$; i9ӱc)D3KHDgg'*+*PUU DQF!&Av;c)BIA]eŋ' ,< Q]d8z֩v?L(X46 wfu) Y rs( z\8[$O;(D)^$Jt2E">aߛ)/2#2ǔos y}3a`` [ ;R><|aYhry ӝʊɡ|Ëav(uWD'rr!_]k +?aT }BfWvv^x~{ah"@VϗZ "zC;;64H= 8~* f\a^!z-2{ ¯b?u֝b a`2޻*": AVvopr?DE`݃Jxgd/A&(HxXXG5  KX/&ýODCXB '=  4ސ9v"YvBUwFu2WEk{$:J,Faǽ#XQ+eºBlɠ] , J</ÕݎX/}衇 :8ueY<u>3!Ǿ)'ni- ߯[V-㦓`( h`=P[(#IN~ D0v<:X &=GEGB7œe˖DUփ2r rin "z;>*Ef 1][(ZZ@~ Io /% B9Krќy"WMZW֬}G~ayQxiֈbqkY-/ؿo4Oi~3[լӬZ ]s.sͭ3[5VuºfUc\*58B.|`=ؽIܞo~~M=Гz& /n&U؎Sv<z? {s[iIxfϊ 4dn*vp"{= fZ\#oX/&1cӪUw@ez"S>v|xREA큾 6RttX߽㻩 憺߸FF|7mڸ@`lj 3@D5/#=<=F "{*2%ϭ073w2X|"rOBܲuo{tw-f;8`<~'!V]Qxo|R0 8/@or {0 $!Fi7 ѧ 11<;xsQٟ}AyYEag !$B]JeJjr(J@+{+[Cإo+Pge)Ie|~%-Orz]mix|l0a5H4Act 2ӔCɃɤ}8m۞d7jT~ڑ U r5 LF22O@AL "naFD.Μv18e:ޏ^wh8om?lVS!_dFOsnpQ|"0NN^k00!pO{\BP !|"|l{>6=z(c'B2SDA"LB/-g #(50y!Bl ??~r/, *pa.0D h=nboG$JIENDB`qstardict-0.12.9.orig/plugins/stardict/lib.h0000644000175000017500000001255611023552133017425 0ustar alexalex#ifndef __SD_LIB_H__ #define __SD_LIB_H__ #include #include #include #include #include #include "dictziplib.hpp" const int MAX_MATCH_ITEM_PER_LIB = 100; const int MAX_FUZZY_DISTANCE = 3; // at most MAX_FUZZY_DISTANCE-1 differences allowed when find similar words struct cacheItem { guint32 offset; gchar *data; //write code here to make it inline cacheItem() { data = NULL; } ~cacheItem() { g_free(data); } }; const int WORDDATA_CACHE_NUM = 10; const int INVALID_INDEX = -100; class DictBase { public: DictBase(); ~DictBase(); gchar * GetWordData(guint32 idxitem_offset, guint32 idxitem_size); bool containSearchData(); bool SearchData(std::vector &SearchWords, guint32 idxitem_offset, guint32 idxitem_size, gchar *origin_data); protected: std::string sametypesequence; FILE *dictfile; std::auto_ptr dictdzfile; private: cacheItem cache[WORDDATA_CACHE_NUM]; gint cache_cur; }; //this structure contain all information about dictionary struct DictInfo { std::string ifo_file_name; guint32 wordcount; std::string bookname; std::string author; std::string email; std::string website; std::string date; std::string description; guint32 index_file_size; std::string sametypesequence; bool load_from_ifo_file(const std::string& ifofilename, bool istreedict); }; class index_file { public: guint32 wordentry_offset; guint32 wordentry_size; virtual ~index_file() {} virtual bool load(const std::string& url, gulong wc, gulong fsize) = 0; virtual const gchar *get_key(glong idx) = 0; virtual void get_data(glong idx) = 0; virtual const gchar *get_key_and_data(glong idx) = 0; virtual bool lookup(const char *str, glong &idx) = 0; }; class Dict : public DictBase { private: std::string ifo_file_name; gulong wordcount; std::string bookname; std::auto_ptr idx_file; bool load_ifofile(const std::string& ifofilename, gulong &idxfilesize); public: Dict() {} bool load(const std::string& ifofilename); gulong narticles() { return wordcount; } const std::string& dict_name() { return bookname; } const std::string& ifofilename() { return ifo_file_name; } const gchar *get_key(glong index) { return idx_file->get_key(index); } gchar *get_data(glong index) { idx_file->get_data(index); return DictBase::GetWordData(idx_file->wordentry_offset, idx_file->wordentry_size); } void get_key_and_data(glong index, const gchar **key, guint32 *offset, guint32 *size) { *key = idx_file->get_key_and_data(index); *offset = idx_file->wordentry_offset; *size = idx_file->wordentry_size; } bool Lookup(const char *str, glong &idx) { return idx_file->lookup(str, idx); } bool LookupWithRule(GPatternSpec *pspec, glong *aIndex, int iBuffLen); }; typedef std::list strlist_t; class Libs { public: typedef void (*progress_func_t)(void); Libs(progress_func_t f = NULL); ~Libs(); void load_dict(const std::string& url); void load(const strlist_t& dicts_dirs, const strlist_t& order_list, const strlist_t& disable_list); void reload(const strlist_t& dicts_dirs, const strlist_t& order_list, const strlist_t& disable_list); glong narticles(int idict) { return oLib[idict]->narticles(); } const std::string& dict_name(int idict) { return oLib[idict]->dict_name(); } gint ndicts() { return oLib.size(); } const gchar * poGetWord(glong iIndex, int iLib) { return oLib[iLib]->get_key(iIndex); } gchar * poGetWordData(glong iIndex, int iLib) { if (iIndex == INVALID_INDEX) return NULL; return oLib[iLib]->get_data(iIndex); } const gchar *poGetCurrentWord(glong *iCurrent); const gchar *poGetNextWord(const gchar *word, glong *iCurrent); const gchar *poGetPreWord(glong *iCurrent); bool LookupWord(const gchar* sWord, glong& iWordIndex, int iLib) { return oLib[iLib]->Lookup(sWord, iWordIndex); } bool LookupSimilarWord(const gchar* sWord, glong & iWordIndex, int iLib); bool SimpleLookupWord(const gchar* sWord, glong & iWordIndex, int iLib); bool LookupWithFuzzy(const gchar *sWord, gchar *reslist[], gint reslist_size, gint iLib); gint LookupWithRule(const gchar *sWord, gchar *reslist[]); bool LookupData(const gchar *sWord, std::vector *reslist); private: std::vector oLib; // word Libs. int iMaxFuzzyDistance; progress_func_t progress_func; }; typedef enum { qtSIMPLE, qtREGEXP, qtFUZZY, qtDATA } query_t; extern query_t analyze_query(const char *s, std::string& res); #endif//!__SD_LIB_H__ qstardict-0.12.9.orig/plugins/stardict/dictziplib.hpp0000644000175000017500000000230511023552133021343 0ustar alexalex#ifndef __DICT_ZIP_LIB_H__ #define __DICT_ZIP_LIB_H__ #include #include #include #include "mapfile.hpp" #define DICT_CACHE_SIZE 5 struct dictCache { int chunk; char *inBuffer; int stamp; int count; }; struct dictData { dictData() {} bool open(const std::string& filename, int computeCRC); void close(); void read(char *buffer, unsigned long start, unsigned long size); ~dictData() { close(); } private: const char *start; /* start of mmap'd area */ const char *end; /* end of mmap'd area */ unsigned long size; /* size of mmap */ int type; z_stream zStream; int initialized; int headerLength; int method; int flags; time_t mtime; int extraFlags; int os; int version; int chunkLength; int chunkCount; int *chunks; unsigned long *offsets; /* Sum-scan of chunks. */ std::string origFilename; std::string comment; unsigned long crc; unsigned long length; unsigned long compressedLength; dictCache cache[DICT_CACHE_SIZE]; MapFile mapfile; int read_header(const std::string &filename, int computeCRC); }; #endif//!__DICT_ZIP_LIB_H__ qstardict-0.12.9.orig/plugins/stardict/distance.cpp0000644000175000017500000001325711023552133021003 0ustar alexalex/* writer : Opera Wang E-Mail : wangvisual AT sohu DOT com License: GPL */ /* filename: distance.cc */ /* http://www.merriampark.com/ld.htm What is Levenshtein Distance? Levenshtein distance (LD) is a measure of the similarity between two strings, which we will refer to as the source string (s) and the target string (t). The distance is the number of deletions, insertions, or substitutions required to transform s into t. For example, * If s is "test" and t is "test", then LD(s,t) = 0, because no transformations are needed. The strings are already identical. * If s is "test" and t is "tent", then LD(s,t) = 1, because one substitution (change "s" to "n") is sufficient to transform s into t. The greater the Levenshtein distance, the more different the strings are. Levenshtein distance is named after the Russian scientist Vladimir Levenshtein, who devised the algorithm in 1965. If you can't spell or pronounce Levenshtein, the metric is also sometimes called edit distance. The Levenshtein distance algorithm has been used in: * Spell checking * Speech recognition * DNA analysis * Plagiarism detection */ #include #include //#include #include "distance.h" #define OPTIMIZE_ED /* Cover transposition, in addition to deletion, insertion and substitution. This step is taken from: Berghel, Hal ; Roach, David : "An Extension of Ukkonen's Enhanced Dynamic Programming ASM Algorithm" (http://www.acm.org/~hlb/publications/asm/asm.html) */ #define COVER_TRANSPOSITION /****************************************/ /*Implementation of Levenshtein distance*/ /****************************************/ EditDistance::EditDistance() { currentelements = 2500; // It's enough for most conditions :-) d = (int*)malloc(sizeof(int) * currentelements); } EditDistance::~EditDistance() { // printf("size:%d\n",currentelements); if (d) free(d); } #ifdef OPTIMIZE_ED int EditDistance::CalEditDistance(const gunichar *s, const gunichar *t, const int limit) /*Compute levenshtein distance between s and t, this is using QUICK algorithm*/ { int n = 0, m = 0, iLenDif, k, i, j, cost; // Remove leftmost matching portion of strings while ( *s && (*s == *t) ) { s++; t++; } while (s[n]) { n++; } while (t[m]) { m++; } // Remove rightmost matching portion of strings by decrement n and m. while ( n && m && (*(s + n - 1) == *(t + m - 1)) ) { n--; m--; } if ( m == 0 || n == 0 || d == (int*)0 ) return (m + n); if ( m < n ) { const gunichar * temp = s; int itemp = n; s = t; t = temp; n = m; m = itemp; } iLenDif = m - n; if ( iLenDif >= limit ) return iLenDif; // step 1 n++; m++; // d=(int*)malloc(sizeof(int)*m*n); if ( m*n > currentelements ) { currentelements = m * n * 2; // double the request d = (int*)realloc(d, sizeof(int) * currentelements); if ( (int*)0 == d ) return (m + n); } // step 2, init matrix for (k = 0;k < n;k++) d[k] = k; for (k = 1;k < m;k++) d[k*n] = k; // step 3 for (i = 1;i < n;i++) { // first calculate column, d(i,j) for ( j = 1;j < iLenDif + i;j++ ) { cost = s[i - 1] == t[j - 1] ? 0 : 1; d[j*n + i] = minimum(d[(j - 1) * n + i] + 1, d[j * n + i - 1] + 1, d[(j - 1) * n + i - 1] + cost); #ifdef COVER_TRANSPOSITION if ( i >= 2 && j >= 2 && (d[j*n + i] - d[(j - 2)*n + i - 2] == 2) && (s[i - 2] == t[j - 1]) && (s[i - 1] == t[j - 2]) ) d[j*n + i]--; #endif } // second calculate row, d(k,j) // now j==iLenDif+i; for ( k = 1;k <= i;k++ ) { cost = s[k - 1] == t[j - 1] ? 0 : 1; d[j*n + k] = minimum(d[(j - 1) * n + k] + 1, d[j * n + k - 1] + 1, d[(j - 1) * n + k - 1] + cost); #ifdef COVER_TRANSPOSITION if ( k >= 2 && j >= 2 && (d[j*n + k] - d[(j - 2)*n + k - 2] == 2) && (s[k - 2] == t[j - 1]) && (s[k - 1] == t[j - 2]) ) d[j*n + k]--; #endif } // test if d(i,j) limit gets equal or exceed if ( d[j*n + i] >= limit ) { return d[j*n + i]; } } // d(n-1,m-1) return d[n*m - 1]; } #else int EditDistance::CalEditDistance(const char *s, const char *t, const int limit) { //Step 1 int k, i, j, n, m, cost; n = strlen(s); m = strlen(t); if ( n != 0 && m != 0 && d != (int*)0 ) { m++; n++; if ( m*n > currentelements ) { currentelements = m * n * 2; d = (int*)realloc(d, sizeof(int) * currentelements); if ( (int*)0 == d ) return (m + n); } //Step 2 for (k = 0;k < n;k++) d[k] = k; for (k = 0;k < m;k++) d[k*n] = k; //Step 3 and 4 for (i = 1;i < n;i++) for (j = 1;j < m;j++) { //Step 5 if (s[i - 1] == t[j - 1]) cost = 0; else cost = 1; //Step 6 d[j*n + i] = minimum(d[(j - 1) * n + i] + 1, d[j * n + i - 1] + 1, d[(j - 1) * n + i - 1] + cost); #ifdef COVER_TRANSPOSITION if ( i >= 2 && j >= 2 && (d[j*n + i] - d[(j - 2)*n + i - 2] == 2) && (s[i - 2] == t[j - 1]) && (s[i - 1] == t[j - 2]) ) d[j*n + i]--; #endif } return d[n*m - 1]; } else return (n + m); } #endif qstardict-0.12.9.orig/plugins/stardict/dictziplib.cpp0000644000175000017500000004143211023552133021342 0ustar alexalex/* dictziplib.c -- * http://stardict.sourceforge.net * Copyright (C) 2003-2003 Hu Zheng * This file is a modify version of dictd-1.9.7's data.c * * data.c -- * Created: Tue Jul 16 12:45:41 1996 by faith@dict.org * Revised: Sat Mar 30 10:46:06 2002 by faith@dict.org * Copyright 1996, 1997, 1998, 2000, 2002 Rickard E. Faith (faith@dict.org) * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ //#define HAVE_MMAP //it will defined in config.h. this can be done by configure.in with a AC_FUNC_MMAP. #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include #include #include #include #include "dictziplib.hpp" #define USE_CACHE 1 #define BUFFERSIZE 10240 /* * Output buffer must be greater than or * equal to 110% of input buffer size, plus * 12 bytes. */ #define OUT_BUFFER_SIZE 0xffffL #define IN_BUFFER_SIZE ((unsigned long)((double)(OUT_BUFFER_SIZE - 12) * 0.89)) /* For gzip-compatible header, as defined in RFC 1952 */ /* Magic for GZIP (rfc1952) */ #define GZ_MAGIC1 0x1f /* First magic byte */ #define GZ_MAGIC2 0x8b /* Second magic byte */ /* FLaGs (bitmapped), from rfc1952 */ #define GZ_FTEXT 0x01 /* Set for ASCII text */ #define GZ_FHCRC 0x02 /* Header CRC16 */ #define GZ_FEXTRA 0x04 /* Optional field (random access index) */ #define GZ_FNAME 0x08 /* Original name */ #define GZ_COMMENT 0x10 /* Zero-terminated, human-readable comment */ #define GZ_MAX 2 /* Maximum compression */ #define GZ_FAST 4 /* Fasted compression */ /* These are from rfc1952 */ #define GZ_OS_FAT 0 /* FAT filesystem (MS-DOS, OS/2, NT/Win32) */ #define GZ_OS_AMIGA 1 /* Amiga */ #define GZ_OS_VMS 2 /* VMS (or OpenVMS) */ #define GZ_OS_UNIX 3 /* Unix */ #define GZ_OS_VMCMS 4 /* VM/CMS */ #define GZ_OS_ATARI 5 /* Atari TOS */ #define GZ_OS_HPFS 6 /* HPFS filesystem (OS/2, NT) */ #define GZ_OS_MAC 7 /* Macintosh */ #define GZ_OS_Z 8 /* Z-System */ #define GZ_OS_CPM 9 /* CP/M */ #define GZ_OS_TOPS20 10 /* TOPS-20 */ #define GZ_OS_NTFS 11 /* NTFS filesystem (NT) */ #define GZ_OS_QDOS 12 /* QDOS */ #define GZ_OS_ACORN 13 /* Acorn RISCOS */ #define GZ_OS_UNKNOWN 255 /* unknown */ #define GZ_RND_S1 'R' /* First magic for random access format */ #define GZ_RND_S2 'A' /* Second magic for random access format */ #define GZ_ID1 0 /* GZ_MAGIC1 */ #define GZ_ID2 1 /* GZ_MAGIC2 */ #define GZ_CM 2 /* Compression Method (Z_DEFALTED) */ #define GZ_FLG 3 /* FLaGs (see above) */ #define GZ_MTIME 4 /* Modification TIME */ #define GZ_XFL 8 /* eXtra FLags (GZ_MAX or GZ_FAST) */ #define GZ_OS 9 /* Operating System */ #define GZ_XLEN 10 /* eXtra LENgth (16bit) */ #define GZ_FEXTRA_START 12 /* Start of extra fields */ #define GZ_SI1 12 /* Subfield ID1 */ #define GZ_SI2 13 /* Subfield ID2 */ #define GZ_SUBLEN 14 /* Subfield length (16bit) */ #define GZ_VERSION 16 /* Version for subfield format */ #define GZ_CHUNKLEN 18 /* Chunk length (16bit) */ #define GZ_CHUNKCNT 20 /* Number of chunks (16bit) */ #define GZ_RNDDATA 22 /* Random access data (16bit) */ #define DICT_UNKNOWN 0 #define DICT_TEXT 1 #define DICT_GZIP 2 #define DICT_DZIP 3 int dictData::read_header(const std::string &fname, int computeCRC) { FILE *str; int id1, id2, si1, si2; char buffer[BUFFERSIZE]; int extraLength, subLength; int i; char *pt; int c; struct stat sb; unsigned long crc = crc32( 0L, Z_NULL, 0 ); int count; unsigned long offset; if (!(str = fopen(fname.c_str(), "rb"))) { //err_fatal_errno( __FUNCTION__, // "Cannot open data file \"%s\" for read\n", filename ); } this->headerLength = GZ_XLEN - 1; this->type = DICT_UNKNOWN; id1 = getc( str ); id2 = getc( str ); if (id1 != GZ_MAGIC1 || id2 != GZ_MAGIC2) { this->type = DICT_TEXT; fstat( fileno( str ), &sb ); this->compressedLength = this->length = sb.st_size; this->origFilename = fname; this->mtime = sb.st_mtime; if (computeCRC) { rewind( str ); while (!feof( str )) { if ((count = fread( buffer, 1, BUFFERSIZE, str ))) { crc = crc32(crc, (Bytef *)buffer, count); } } } this->crc = crc; fclose( str ); return 0; } this->type = DICT_GZIP; this->method = getc( str ); this->flags = getc( str ); this->mtime = getc( str ) << 0; this->mtime |= getc( str ) << 8; this->mtime |= getc( str ) << 16; this->mtime |= getc( str ) << 24; this->extraFlags = getc( str ); this->os = getc( str ); if (this->flags & GZ_FEXTRA) { extraLength = getc( str ) << 0; extraLength |= getc( str ) << 8; this->headerLength += extraLength + 2; si1 = getc( str ); si2 = getc( str ); if (si1 == GZ_RND_S1 || si2 == GZ_RND_S2) { subLength = getc( str ) << 0; subLength |= getc( str ) << 8; this->version = getc( str ) << 0; this->version |= getc( str ) << 8; if (this->version != 1) { //err_internal( __FUNCTION__, // "dzip header version %d not supported\n", // this->version ); } this->chunkLength = getc( str ) << 0; this->chunkLength |= getc( str ) << 8; this->chunkCount = getc( str ) << 0; this->chunkCount |= getc( str ) << 8; if (this->chunkCount <= 0) { fclose( str ); return 5; } this->chunks = (int *)malloc(sizeof( this->chunks[0] ) * this->chunkCount ); for (i = 0; i < this->chunkCount; i++) { this->chunks[i] = getc( str ) << 0; this->chunks[i] |= getc( str ) << 8; } this->type = DICT_DZIP; } else { fseek( str, this->headerLength, SEEK_SET ); } } if (this->flags & GZ_FNAME) { /* FIXME! Add checking against header len */ pt = buffer; while ((c = getc( str )) && c != EOF) * pt++ = c; *pt = '\0'; this->origFilename = buffer; this->headerLength += this->origFilename.length() + 1; } else { this->origFilename = ""; } if (this->flags & GZ_COMMENT) { /* FIXME! Add checking for header len */ pt = buffer; while ((c = getc( str )) && c != EOF) * pt++ = c; *pt = '\0'; comment = buffer; headerLength += comment.length() + 1; } else { comment = ""; } if (this->flags & GZ_FHCRC) { getc( str ); getc( str ); this->headerLength += 2; } if (ftell( str ) != this->headerLength + 1) { //err_internal( __FUNCTION__, // "File position (%lu) != header length + 1 (%d)\n", // ftell( str ), this->headerLength + 1 ); } fseek( str, -8, SEEK_END ); this->crc = getc( str ) << 0; this->crc |= getc( str ) << 8; this->crc |= getc( str ) << 16; this->crc |= getc( str ) << 24; this->length = getc( str ) << 0; this->length |= getc( str ) << 8; this->length |= getc( str ) << 16; this->length |= getc( str ) << 24; this->compressedLength = ftell( str ); /* Compute offsets */ this->offsets = (unsigned long *)malloc( sizeof( this->offsets[0] ) * this->chunkCount ); for (offset = this->headerLength + 1, i = 0; i < this->chunkCount; i++) { this->offsets[i] = offset; offset += this->chunks[i]; } fclose( str ); return 0; } bool dictData::open(const std::string& fname, int computeCRC) { struct stat sb; int j; int fd; this->initialized = 0; if (stat(fname.c_str(), &sb) || !S_ISREG(sb.st_mode)) { //err_warning( __FUNCTION__, // "%s is not a regular file -- ignoring\n", fname ); return false; } if (read_header(fname, computeCRC)) { //err_fatal( __FUNCTION__, // "\"%s\" not in text or dzip format\n", fname ); return false; } if ((fd = ::open(fname.c_str(), O_RDONLY )) < 0) { //err_fatal_errno( __FUNCTION__, // "Cannot open data file \"%s\"\n", fname ); return false; } if (fstat(fd, &sb)) { //err_fatal_errno( __FUNCTION__, // "Cannot stat data file \"%s\"\n", fname ); return false; } this->size = sb.st_size; ::close(fd); if (!mapfile.open(fname.c_str(), size)) return false; this->start = mapfile.begin(); this->end = this->start + this->size; for (j = 0; j < DICT_CACHE_SIZE; j++) { cache[j].chunk = -1; cache[j].stamp = -1; cache[j].inBuffer = NULL; cache[j].count = 0; } return true; } void dictData::close() { int i; if (this->chunks) free(this->chunks); if (this->offsets) free(this->offsets); if (this->initialized) { if (inflateEnd( &this->zStream )) { //err_internal( __FUNCTION__, // "Cannot shut down inflation engine: %s\n", // this->zStream.msg ); } } for (i = 0; i < DICT_CACHE_SIZE; ++i) { if (this -> cache [i].inBuffer) free (this -> cache [i].inBuffer); } } void dictData::read(char *buffer, unsigned long start, unsigned long size) { char *pt; unsigned long end; int count; char *inBuffer; char outBuffer[OUT_BUFFER_SIZE]; int firstChunk, lastChunk; int firstOffset, lastOffset; int i, j; int found, target, lastStamp; static int stamp = 0; end = start + size; //buffer = malloc( size + 1 ); //PRINTF(DBG_UNZIP, // ("dict_data_read( %p, %lu, %lu )\n", //h, start, size )); switch (this->type) { case DICT_GZIP: //err_fatal( __FUNCTION__, // "Cannot seek on pure gzip format files.\n" // "Use plain text (for performance)" // " or dzip format (for space savings).\n" ); break; case DICT_TEXT: memcpy( buffer, this->start + start, size ); //buffer[size] = '\0'; break; case DICT_DZIP: if (!this->initialized) { ++this->initialized; this->zStream.zalloc = NULL; this->zStream.zfree = NULL; this->zStream.opaque = NULL; this->zStream.next_in = 0; this->zStream.avail_in = 0; this->zStream.next_out = NULL; this->zStream.avail_out = 0; if (inflateInit2( &this->zStream, -15 ) != Z_OK) { //err_internal( __FUNCTION__, // "Cannot initialize inflation engine: %s\n", //this->zStream.msg ); } } firstChunk = start / this->chunkLength; firstOffset = start - firstChunk * this->chunkLength; lastChunk = end / this->chunkLength; lastOffset = end - lastChunk * this->chunkLength; //PRINTF(DBG_UNZIP, // (" start = %lu, end = %lu\n" //"firstChunk = %d, firstOffset = %d," //" lastChunk = %d, lastOffset = %d\n", //start, end, firstChunk, firstOffset, lastChunk, lastOffset )); for (pt = buffer, i = firstChunk; i <= lastChunk; i++) { /* Access cache */ found = 0; target = 0; lastStamp = INT_MAX; for (j = 0; j < DICT_CACHE_SIZE; j++) { #if USE_CACHE if (this->cache[j].chunk == i) { found = 1; target = j; break; } #endif if (this->cache[j].stamp < lastStamp) { lastStamp = this->cache[j].stamp; target = j; } } this->cache[target].stamp = ++stamp; if (found) { count = this->cache[target].count; inBuffer = this->cache[target].inBuffer; } else { this->cache[target].chunk = i; if (!this->cache[target].inBuffer) this->cache[target].inBuffer = (char *)malloc( IN_BUFFER_SIZE ); inBuffer = this->cache[target].inBuffer; if (this->chunks[i] >= OUT_BUFFER_SIZE ) { //err_internal( __FUNCTION__, // "this->chunks[%d] = %d >= %ld (OUT_BUFFER_SIZE)\n", // i, this->chunks[i], OUT_BUFFER_SIZE ); } memcpy( outBuffer, this->start + this->offsets[i], this->chunks[i] ); this->zStream.next_in = (Bytef *)outBuffer; this->zStream.avail_in = this->chunks[i]; this->zStream.next_out = (Bytef *)inBuffer; this->zStream.avail_out = IN_BUFFER_SIZE; if (inflate( &this->zStream, Z_PARTIAL_FLUSH ) != Z_OK) { //err_fatal( __FUNCTION__, "inflate: %s\n", this->zStream.msg ); } if (this->zStream.avail_in) { //err_internal( __FUNCTION__, // "inflate did not flush (%d pending, %d avail)\n", // this->zStream.avail_in, this->zStream.avail_out ); } count = IN_BUFFER_SIZE - this->zStream.avail_out; this->cache[target].count = count; } if (i == firstChunk) { if (i == lastChunk) { memcpy( pt, inBuffer + firstOffset, lastOffset - firstOffset); pt += lastOffset - firstOffset; } else { if (count != this->chunkLength ) { //err_internal( __FUNCTION__, // "Length = %d instead of %d\n", //count, this->chunkLength ); } memcpy( pt, inBuffer + firstOffset, this->chunkLength - firstOffset ); pt += this->chunkLength - firstOffset; } } else if (i == lastChunk) { memcpy( pt, inBuffer, lastOffset ); pt += lastOffset; } else { assert( count == this->chunkLength ); memcpy( pt, inBuffer, this->chunkLength ); pt += this->chunkLength; } } //*pt = '\0'; break; case DICT_UNKNOWN: //err_fatal( __FUNCTION__, "Cannot read unknown file type\n" ); break; } } qstardict-0.12.9.orig/plugins/stardict/stardict.cpp0000644000175000017500000003375211023552133021030 0ustar alexalex/***************************************************************************** * stardict.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "stardict.h" #include #include #include #include #include #include #include #include #include #include #include #include "lib.h" #include "file.hpp" #include "settingsdialog.h" #include namespace { void xdxf2html(QString &str); QString whereDict(const QString &name, const QStringList &dictDirs); const int MaxFuzzy = 24; class StdList: public std::list { public: StdList() : std::list() { } StdList(const QList &list) : std::list() { for (QList::const_iterator i = list.begin(); i != list.end(); ++i) push_back(i->toUtf8().data()); } StdList(const std::list &list) : std::list(list) { } QStringList toStringList() const { QStringList list; for (const_iterator i = begin(); i != end(); ++i) list << QString::fromUtf8(i->c_str()); return list; } }; class IfoListSetter { public: IfoListSetter(QStringList *list) : m_list(list) { } void operator ()(const std::string &filename, bool) { DictInfo info; if (info.load_from_ifo_file(filename, false)) m_list->push_back(QString::fromUtf8(info.bookname.c_str())); } private: QStringList *m_list; }; class IfoFileFinder { public: IfoFileFinder(const QString &name, QString *filename) : m_name(name.toUtf8().data()), m_filename(filename) { } void operator()(const std::string &filename, bool) { DictInfo info; if (info.load_from_ifo_file(filename, false) && info.bookname == m_name) { *m_filename = QString::fromUtf8(filename.c_str()); } } private: std::string m_name; QString *m_filename; }; } StarDict::StarDict(QObject *parent) : QObject(parent) { m_sdLibs = new Libs; QSettings settings(workPath() + "/settings.ini", QSettings::IniFormat); m_dictDirs = settings.value("StarDict/dictDirs", m_dictDirs).toStringList(); m_reformatLists = settings.value("StarDict/reformatLists", true).toBool(); m_expandAbbreviations = settings.value("StarDict/expandAbbreviations", true).toBool(); if (m_dictDirs.isEmpty()) { #ifdef Q_OS_UNIX m_dictDirs << "/usr/share/stardict/dic"; #else m_dictDirs << QCoreApplication::applicationDirPath() + "/dic"; #endif // Q_OS_UNIX m_dictDirs << QDir::homePath() + "/.stardict/dic"; } } StarDict::~StarDict() { QSettings settings(workPath() + "/settings.ini", QSettings::IniFormat); settings.setValue("StarDict/dictDirs", m_dictDirs); settings.setValue("StarDict/reformatLists", m_reformatLists); settings.setValue("StarDict/expandAbbreviations", m_expandAbbreviations); delete m_sdLibs; } QStringList StarDict::availableDicts() const { QStringList result; IfoListSetter setter(&result); for_each_file(StdList(m_dictDirs), ".ifo", StdList(), StdList(), setter); return result; } void StarDict::setLoadedDicts(const QStringList &loadedDicts) { QStringList available = availableDicts(); StdList disabled; for (QStringList::const_iterator i = available.begin(); i != available.end(); ++i) { if (! loadedDicts.contains(*i)) disabled.push_back(i->toUtf8().data()); } m_sdLibs->reload(StdList(m_dictDirs), StdList(loadedDicts), disabled); m_loadedDicts.clear(); for (int i = 0; i < m_sdLibs->ndicts(); ++i) m_loadedDicts[QString::fromUtf8(m_sdLibs->dict_name(i).c_str())] = i; } StarDict::DictInfo StarDict::dictInfo(const QString &dict) { ::DictInfo nativeInfo; nativeInfo.wordcount = 0; if (! nativeInfo.load_from_ifo_file(whereDict(dict, m_dictDirs).toUtf8().data(), false)) { return DictInfo(); } DictInfo result(name(), dict); result.setAuthor(QString::fromUtf8(nativeInfo.author.c_str())); result.setDescription(QString::fromUtf8(nativeInfo.description.c_str())); result.setWordsCount(nativeInfo.wordcount ? static_cast(nativeInfo.wordcount) : -1); return result; } bool StarDict::isTranslatable(const QString &dict, const QString &word) { if (! m_loadedDicts.contains(dict)) return false; long ind; return m_sdLibs->SimpleLookupWord(word.toUtf8().data(), ind, m_loadedDicts[dict]); } StarDict::Translation StarDict::translate(const QString &dict, const QString &word) { if (! m_loadedDicts.contains(dict)) return Translation(); if (word.isEmpty()) return Translation(); int dictIndex = m_loadedDicts[dict]; long ind; if (! m_sdLibs->SimpleLookupWord(word.toUtf8().data(), ind, m_loadedDicts[dict])) return Translation(); return Translation(QString::fromUtf8(m_sdLibs->poGetWord(ind, dictIndex)), QString::fromUtf8(m_sdLibs->dict_name(dictIndex).c_str()), parseData(m_sdLibs->poGetWordData(ind, dictIndex), dictIndex, true, m_reformatLists, m_expandAbbreviations)); } QStringList StarDict::findSimilarWords(const QString &dict, const QString &word) { if (! m_loadedDicts.contains(dict)) return QStringList(); gchar *fuzzy_res[MaxFuzzy]; if (! m_sdLibs->LookupWithFuzzy(word.toUtf8().data(), fuzzy_res, MaxFuzzy, m_loadedDicts[dict])) return QStringList(); QStringList result; for (gchar **p = fuzzy_res, **end = fuzzy_res + MaxFuzzy; p != end && *p; ++p) { result << QString::fromUtf8(*p); g_free(*p); } return result; } int StarDict::execSettingsDialog(QWidget *parent) { ::SettingsDialog dialog(this, parent); return dialog.exec(); } QString StarDict::parseData(const char *data, int dictIndex, bool htmlSpaces, bool reformatLists, bool expandAbbreviations) { QString result; quint32 dataSize = *reinterpret_cast(data); const char *dataEnd = data + dataSize; const char *ptr = data + sizeof(quint32); while (ptr < dataEnd) { switch (*ptr++) { case 'm': case 'l': case 'g': { QString str = QString::fromUtf8(ptr); ptr += str.toUtf8().length() + 1; result += str; break; } case 'x': { QString str = QString::fromUtf8(ptr); ptr += str.toUtf8().length() + 1; xdxf2html(str); result += str; break; } case 't': { QString str = QString::fromUtf8(ptr); ptr += str.toUtf8().length() + 1; result += ""; result += str; result += ""; break; } case 'y': { ptr += strlen(ptr) + 1; break; } case 'W': case 'P': { ptr += *reinterpret_cast(ptr) + sizeof(quint32); break; } default: ; // nothing } } if (expandAbbreviations) { QRegExp regExp("_\\S+[\\.:]"); int pos = 0; while ((pos = regExp.indexIn(result, pos)) != -1) { long ind; if (m_sdLibs->SimpleLookupWord(result.mid(pos, regExp.matchedLength()).toUtf8().data(), ind, dictIndex)) { QString expanded = ""; expanded += parseData(m_sdLibs->poGetWordData(ind, dictIndex)); if (result[pos + regExp.matchedLength() - 1] == ':') expanded += ':'; expanded += ""; result.replace(pos, regExp.matchedLength(), expanded); pos += expanded.length(); } else pos += regExp.matchedLength(); } } if (reformatLists) { int pos = 0; QStack openedLists; while (pos < result.length()) { if (result[pos].isDigit()) { int n = 0; while (result[pos + n].isDigit()) ++n; pos += n; if (result[pos] == '&' && result.mid(pos + 1, 3) == "gt;") result.replace(pos, 4, ">"); QChar marker = result[pos]; QString replacement; if (marker == '>' || marker == '.' || marker == ')') { if (n == 1 && result[pos - 1] == '1') // open new list { if (openedLists.contains(marker)) { replacement = ""; while (openedLists.size() && openedLists.top() != marker) { replacement += ""; openedLists.pop(); } } openedLists.push(marker); replacement += "
    "; } else { while (openedLists.size() && openedLists.top() != marker) { replacement += "
"; openedLists.pop(); } replacement += ""; } replacement += "
  • "; pos -= n; n += pos; while (result[pos - 1].isSpace()) --pos; while (result[n + 1].isSpace()) ++n; result.replace(pos, n - pos + 1, replacement); pos += replacement.length(); } else ++pos; } else ++pos; } while (openedLists.size()) { result += "
  • "; openedLists.pop(); } } if (htmlSpaces) { int n = 0; while (result[n].isSpace()) ++n; result.remove(0, n); n = 0; while (result[result.length() - 1 - n].isSpace()) ++n; result.remove(result.length() - n, n); for (int pos = 0; pos < result.length();) { switch (result[pos].toAscii()) { case '[': result.insert(pos, ""); pos += 28 + 1; // sizeof "" + 1 break; case ']': result.insert(pos + 1, ""); pos += 7 + 1; // sizeof "" + 1 break; case '\t': result.insert(pos, "    "); pos += 24 + 1; // sizeof "    " + 1 break; case '\n': { int count = 1; n = 1; while (result[pos + n].isSpace()) { if (result[pos + n] == '\n') ++count; ++n; } if (count > 1) result.replace(pos, n, "

    "); else result.replace(pos, n, "
    "); break; } default: ++pos; } } } return result; } namespace { QString whereDict(const QString &name, const QStringList &dictDirs) { QString filename; IfoFileFinder finder(name, &filename); for_each_file(StdList(dictDirs), ".ifo", StdList(), StdList(), finder); return filename; } void xdxf2html(QString &str) { str.replace("", ""); str.replace("", "["); str.replace("", "]"); str.replace("", ""); str.replace(QRegExp(".*<\\/k>"), ""); str.replace(QRegExp("(<\\/abr>)|(<\\ex>)"), " #include "ui_settingsdialog.h" class StarDict; class SettingsDialog: public QDialog, private Ui::SettingsDialog { Q_OBJECT public: SettingsDialog(StarDict *plugin, QWidget *parent = 0); private slots: void on_addDictDirButton_clicked(); void on_removeDictDirButton_clicked(); void on_moveUpDictDirButton_clicked(); void on_moveDownDictDirButton_clicked(); void apply(); private: StarDict *m_plugin; }; #endif // SETTINGSDIALOG_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent qstardict-0.12.9.orig/plugins/stardict/stardict.pro0000644000175000017500000000334311023552133021037 0ustar alexalex############################################################################# # stardict.pro - QStarDict, a StarDict clone written with using Qt # # Copyright (C) 2008 Alexander Rodin # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License along # # with this program; if not, write to the Free Software Foundation, Inc., # # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # ############################################################################# TARGET = stardict include(../plugin.pri) HEADERS += \ stardict.h \ dictziplib.hpp \ distance.h \ file.hpp \ lib.h \ mapfile.hpp \ settingsdialog.h SOURCES += \ stardict.cpp \ dictziplib.cpp \ distance.cpp \ lib.cpp \ settingsdialog.cpp FORMS += \ settingsdialog.ui RESOURCES += \ pixmaps/pixmaps.qrc qstardict-0.12.9.orig/plugins/stardict/mapfile.hpp0000644000175000017500000000446111023552133020630 0ustar alexalex#ifndef _MAPFILE_HPP_ #define _MAPFILE_HPP_ #ifdef HAVE_CONFIG_H # include "config.h" #endif #ifdef HAVE_MMAP # include # include # include #endif #ifdef _WIN32 # include #endif #include class MapFile { public: MapFile(void) : data(NULL), #ifdef HAVE_MMAP mmap_fd( -1) #elif defined(_WIN32) hFile(0), hFileMap(0) #endif { } ~MapFile(); bool open(const char *file_name, unsigned long file_size); inline gchar *begin(void) { return data; } private: char *data; unsigned long size; #ifdef HAVE_MMAP int mmap_fd; #elif defined(_WIN32) HANDLE hFile; HANDLE hFileMap; #endif }; inline bool MapFile::open(const char *file_name, unsigned long file_size) { size = file_size; #ifdef HAVE_MMAP if ((mmap_fd = ::open(file_name, O_RDONLY)) < 0) { //g_print("Open file %s failed!\n",fullfilename); return false; } data = (gchar *)mmap( NULL, file_size, PROT_READ, MAP_SHARED, mmap_fd, 0); if ((void *)data == (void *)( -1)) { //g_print("mmap file %s failed!\n",idxfilename); data = NULL; return false; } #elif defined( _WIN32) #ifdef UNICODE gunichar2 *fn = g_utf8_to_utf16(file_name, -1, NULL, NULL, NULL); #else // UNICODE gchar *fn = file_name; #endif // UNICODE hFile = CreateFile(fn, GENERIC_READ, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); #ifdef UNICODE g_free(fn); #endif // UNICODE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, file_size, NULL); data = (gchar *)MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, file_size); #else // defined( _WIN32) gsize read_len; if (!g_file_get_contents(file_name, &data, &read_len, NULL)) return false; if (read_len != file_size) return false; #endif return true; } inline MapFile::~MapFile() { if (!data) return ; #ifdef HAVE_MMAP munmap(data, size); close(mmap_fd); #else # ifdef _WIN32 UnmapViewOfFile(data); CloseHandle(hFileMap); CloseHandle(hFile); # else g_free(data); # endif #endif } #endif//!_MAPFILE_HPP_ qstardict-0.12.9.orig/plugins/stardict/lib.cpp0000644000175000017500000016001711023552133017754 0ustar alexalex#ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include #include #include "distance.h" #include "file.hpp" #include "mapfile.hpp" #include "lib.h" // Notice: read src/tools/DICTFILE_FORMAT for the dictionary // file's format information! static inline bool bIsVowel(gchar inputchar) { gchar ch = g_ascii_toupper(inputchar); return ( ch == 'A' || ch == 'E' || ch == 'I' || ch == 'O' || ch == 'U' ); } static bool bIsPureEnglish(const gchar *str) { // i think this should work even when it is UTF8 string :). for (int i = 0; str[i] != 0; i++) //if(str[i]<0) //if(str[i]<32 || str[i]>126) // tab equal 9,so this is not OK. // Better use isascii() but not str[i]<0 while char is default unsigned in arm if (!isascii(str[i])) return false; return true; } static inline gint stardict_strcmp(const gchar *s1, const gchar *s2) { gint a = g_ascii_strcasecmp(s1, s2); if (a == 0) return strcmp(s1, s2); else return a; } bool DictInfo::load_from_ifo_file(const std::string& ifofilename, bool istreedict) { ifo_file_name = ifofilename; gchar *buffer; if (!g_file_get_contents(ifofilename.c_str(), &buffer, NULL, NULL)) return false; #define TREEDICT_MAGIC_DATA "StarDict's treedict ifo file\nversion=2.4.2\n" #define DICT_MAGIC_DATA "StarDict's dict ifo file\nversion=2.4.2\n" const gchar *magic_data = istreedict ? TREEDICT_MAGIC_DATA : DICT_MAGIC_DATA; if (!g_str_has_prefix(buffer, magic_data)) { g_free(buffer); return false; } gchar *p1, *p2, *p3; p1 = buffer + strlen(magic_data) - 1; p2 = strstr(p1, "\nwordcount="); if (!p2) { g_free(buffer); return false; } p3 = strchr(p2 + sizeof("\nwordcount=") - 1, '\n'); gchar *tmpstr = (gchar *)g_memdup(p2 + sizeof("\nwordcount=") - 1, p3 - (p2 + sizeof("\nwordcount=") - 1) + 1); tmpstr[p3 - (p2 + sizeof("\nwordcount=") - 1)] = '\0'; wordcount = atol(tmpstr); g_free(tmpstr); if (istreedict) { p2 = strstr(p1, "\ntdxfilesize="); if (!p2) { g_free(buffer); return false; } p3 = strchr(p2 + sizeof("\ntdxfilesize=") - 1, '\n'); tmpstr = (gchar *)g_memdup(p2 + sizeof("\ntdxfilesize=") - 1, p3 - (p2 + sizeof("\ntdxfilesize=") - 1) + 1); tmpstr[p3 - (p2 + sizeof("\ntdxfilesize=") - 1)] = '\0'; index_file_size = atol(tmpstr); g_free(tmpstr); } else { p2 = strstr(p1, "\nidxfilesize="); if (!p2) { g_free(buffer); return false; } p3 = strchr(p2 + sizeof("\nidxfilesize=") - 1, '\n'); tmpstr = (gchar *)g_memdup(p2 + sizeof("\nidxfilesize=") - 1, p3 - (p2 + sizeof("\nidxfilesize=") - 1) + 1); tmpstr[p3 - (p2 + sizeof("\nidxfilesize=") - 1)] = '\0'; index_file_size = atol(tmpstr); g_free(tmpstr); } p2 = strstr(p1, "\nbookname="); if (!p2) { g_free(buffer); return false; } p2 = p2 + sizeof("\nbookname=") - 1; p3 = strchr(p2, '\n'); bookname.assign(p2, p3 - p2); p2 = strstr(p1, "\nauthor="); if (p2) { p2 = p2 + sizeof("\nauthor=") - 1; p3 = strchr(p2, '\n'); author.assign(p2, p3 - p2); } p2 = strstr(p1, "\nemail="); if (p2) { p2 = p2 + sizeof("\nemail=") - 1; p3 = strchr(p2, '\n'); email.assign(p2, p3 - p2); } p2 = strstr(p1, "\nwebsite="); if (p2) { p2 = p2 + sizeof("\nwebsite=") - 1; p3 = strchr(p2, '\n'); website.assign(p2, p3 - p2); } p2 = strstr(p1, "\ndate="); if (p2) { p2 = p2 + sizeof("\ndate=") - 1; p3 = strchr(p2, '\n'); date.assign(p2, p3 - p2); } p2 = strstr(p1, "\ndescription="); if (p2) { p2 = p2 + sizeof("\ndescription=") - 1; p3 = strchr(p2, '\n'); description.assign(p2, p3 - p2); } p2 = strstr(p1, "\nsametypesequence="); if (p2) { p2 += sizeof("\nsametypesequence=") - 1; p3 = strchr(p2, '\n'); sametypesequence.assign(p2, p3 - p2); } g_free(buffer); return true; } //=================================================================== DictBase::DictBase() { dictfile = NULL; cache_cur = 0; } DictBase::~DictBase() { if (dictfile) fclose(dictfile); } gchar* DictBase::GetWordData(guint32 idxitem_offset, guint32 idxitem_size) { for (int i = 0; i < WORDDATA_CACHE_NUM; i++) if (cache[i].data && cache[i].offset == idxitem_offset) return cache[i].data; if (dictfile) fseek(dictfile, idxitem_offset, SEEK_SET); gchar *data; if (!sametypesequence.empty()) { gchar *origin_data = (gchar *)g_malloc(idxitem_size); if (dictfile) fread(origin_data, idxitem_size, 1, dictfile); else dictdzfile->read(origin_data, idxitem_offset, idxitem_size); guint32 data_size; gint sametypesequence_len = sametypesequence.length(); //there have sametypesequence_len char being omitted. data_size = idxitem_size + sizeof(guint32) + sametypesequence_len; //if the last item's size is determined by the end up '\0',then +=sizeof(gchar); //if the last item's size is determined by the head guint32 type data,then +=sizeof(guint32); switch (sametypesequence[sametypesequence_len - 1]) { case 'm': case 't': case 'y': case 'l': case 'g': case 'x': data_size += sizeof(gchar); break; case 'W': case 'P': data_size += sizeof(guint32); break; default: if (g_ascii_isupper(sametypesequence[sametypesequence_len - 1])) data_size += sizeof(guint32); else data_size += sizeof(gchar); break; } data = (gchar *)g_malloc(data_size); gchar *p1, *p2; p1 = data + sizeof(guint32); p2 = origin_data; guint32 sec_size; //copy the head items. for (int i = 0; i < sametypesequence_len - 1; i++) { *p1 = sametypesequence[i]; p1 += sizeof(gchar); switch (sametypesequence[i]) { case 'm': case 't': case 'y': case 'l': case 'g': case 'x': sec_size = strlen(p2) + 1; memcpy(p1, p2, sec_size); p1 += sec_size; p2 += sec_size; break; case 'W': case 'P': sec_size = *reinterpret_cast(p2); sec_size += sizeof(guint32); memcpy(p1, p2, sec_size); p1 += sec_size; p2 += sec_size; break; default: if (g_ascii_isupper(sametypesequence[i])) { sec_size = *reinterpret_cast(p2); sec_size += sizeof(guint32); } else { sec_size = strlen(p2) + 1; } memcpy(p1, p2, sec_size); p1 += sec_size; p2 += sec_size; break; } } //calculate the last item 's size. sec_size = idxitem_size - (p2 - origin_data); *p1 = sametypesequence[sametypesequence_len - 1]; p1 += sizeof(gchar); switch (sametypesequence[sametypesequence_len - 1]) { case 'm': case 't': case 'y': case 'l': case 'g': case 'x': memcpy(p1, p2, sec_size); p1 += sec_size; *p1 = '\0'; //add the end up '\0'; break; case 'W': case 'P': *reinterpret_cast(p1) = sec_size; p1 += sizeof(guint32); memcpy(p1, p2, sec_size); break; default: if (g_ascii_isupper(sametypesequence[sametypesequence_len - 1])) { *reinterpret_cast(p1) = sec_size; p1 += sizeof(guint32); memcpy(p1, p2, sec_size); } else { memcpy(p1, p2, sec_size); p1 += sec_size; *p1 = '\0'; } break; } g_free(origin_data); *reinterpret_cast(data) = data_size; } else { data = (gchar *)g_malloc(idxitem_size + sizeof(guint32)); if (dictfile) fread(data + sizeof(guint32), idxitem_size, 1, dictfile); else dictdzfile->read(data + sizeof(guint32), idxitem_offset, idxitem_size); *reinterpret_cast(data) = idxitem_size + sizeof(guint32); } g_free(cache[cache_cur].data); cache[cache_cur].data = data; cache[cache_cur].offset = idxitem_offset; cache_cur++; if (cache_cur == WORDDATA_CACHE_NUM) cache_cur = 0; return data; } inline bool DictBase::containSearchData() { if (sametypesequence.empty()) return true; return sametypesequence.find_first_of("mlgxty") != std::string::npos; } bool DictBase::SearchData(std::vector &SearchWords, guint32 idxitem_offset, guint32 idxitem_size, gchar *origin_data) { int nWord = SearchWords.size(); std::vector WordFind(nWord, false); int nfound = 0; if (dictfile) fseek(dictfile, idxitem_offset, SEEK_SET); if (dictfile) fread(origin_data, idxitem_size, 1, dictfile); else dictdzfile->read(origin_data, idxitem_offset, idxitem_size); gchar *p = origin_data; guint32 sec_size; int j; if (!sametypesequence.empty()) { gint sametypesequence_len = sametypesequence.length(); for (int i = 0; i < sametypesequence_len - 1; i++) { switch (sametypesequence[i]) { case 'm': case 't': case 'y': case 'l': case 'g': case 'x': for (j = 0; j < nWord; j++) if (!WordFind[j] && strstr(p, SearchWords[j].c_str())) { WordFind[j] = true; ++nfound; } if (nfound == nWord) return true; sec_size = strlen(p) + 1; p += sec_size; break; default: if (g_ascii_isupper(sametypesequence[i])) { sec_size = *reinterpret_cast(p); sec_size += sizeof(guint32); } else { sec_size = strlen(p) + 1; } p += sec_size; } } switch (sametypesequence[sametypesequence_len - 1]) { case 'm': case 't': case 'y': case 'l': case 'g': case 'x': sec_size = idxitem_size - (p - origin_data); for (j = 0; j < nWord; j++) if (!WordFind[j] && g_strstr_len(p, sec_size, SearchWords[j].c_str())) { WordFind[j] = true; ++nfound; } if (nfound == nWord) return true; break; } } else { while (guint32(p - origin_data) < idxitem_size) { switch (*p) { case 'm': case 't': case 'y': case 'l': case 'g': case 'x': for (j = 0; j < nWord; j++) if (!WordFind[j] && strstr(p, SearchWords[j].c_str())) { WordFind[j] = true; ++nfound; } if (nfound == nWord) return true; sec_size = strlen(p) + 1; p += sec_size; break; default: if (g_ascii_isupper(*p)) { sec_size = *reinterpret_cast(p); sec_size += sizeof(guint32); } else { sec_size = strlen(p) + 1; } p += sec_size; } } } return false; } class offset_index : public index_file { public: offset_index() : idxfile(NULL) {} ~offset_index(); bool load(const std::string& url, gulong wc, gulong fsize); const gchar *get_key(glong idx); void get_data(glong idx); const gchar *get_key_and_data(glong idx); bool lookup(const char *str, glong &idx); private: static const gint ENTR_PER_PAGE = 32; static const char *CACHE_MAGIC; std::vector wordoffset; FILE *idxfile; gulong wordcount; gchar wordentry_buf[256 + sizeof(guint32)*2]; // The length of "word_str" should be less than 256. See src/tools/DICTFILE_FORMAT. struct index_entry { glong idx; std::string keystr; void assign(glong i, const std::string& str) { idx = i; keystr.assign(str); } }; index_entry first, last, middle, real_last; struct page_entry { gchar *keystr; guint32 off, size; }; std::vector page_data; struct page_t { glong idx; page_entry entries[ENTR_PER_PAGE]; page_t(): idx( -1) {} void fill(gchar *data, gint nent, glong idx_); } page; gulong load_page(glong page_idx); const gchar *read_first_on_page_key(glong page_idx); const gchar *get_first_on_page_key(glong page_idx); bool load_cache(const std::string& url); bool save_cache(const std::string& url); static strlist_t get_cache_variant(const std::string& url); }; const char *offset_index::CACHE_MAGIC = "StarDict's Cache, Version: 0.1"; class wordlist_index : public index_file { public: wordlist_index() : idxdatabuf(NULL) {} ~wordlist_index(); bool load(const std::string& url, gulong wc, gulong fsize); const gchar *get_key(glong idx); void get_data(glong idx); const gchar *get_key_and_data(glong idx); bool lookup(const char *str, glong &idx); private: gchar *idxdatabuf; std::vector wordlist; }; void offset_index::page_t::fill(gchar *data, gint nent, glong idx_) { idx = idx_; gchar *p = data; glong len; for (gint i = 0; i < nent; ++i) { entries[i].keystr = p; len = strlen(p); p += len + 1; entries[i].off = g_ntohl(*reinterpret_cast(p)); p += sizeof(guint32); entries[i].size = g_ntohl(*reinterpret_cast(p)); p += sizeof(guint32); } } offset_index::~offset_index() { if (idxfile) fclose(idxfile); } inline const gchar *offset_index::read_first_on_page_key(glong page_idx) { fseek(idxfile, wordoffset[page_idx], SEEK_SET); guint page_size = wordoffset[page_idx + 1] - wordoffset[page_idx]; fread(wordentry_buf, std::min(sizeof(wordentry_buf), page_size), 1, idxfile); //TODO: check returned values, deal with word entry that strlen>255. return wordentry_buf; } inline const gchar *offset_index::get_first_on_page_key(glong page_idx) { if (page_idx < middle.idx) { if (page_idx == first.idx) return first.keystr.c_str(); return read_first_on_page_key(page_idx); } else if (page_idx > middle.idx) { if (page_idx == last.idx) return last.keystr.c_str(); return read_first_on_page_key(page_idx); } else return middle.keystr.c_str(); } bool offset_index::load_cache(const std::string& url) { strlist_t vars = get_cache_variant(url); for (strlist_t::const_iterator it = vars.begin(); it != vars.end(); ++it) { struct stat idxstat, cachestat; if (g_stat(url.c_str(), &idxstat) != 0 || g_stat(it->c_str(), &cachestat) != 0) continue; if (cachestat.st_mtime < idxstat.st_mtime) continue; MapFile mf; if (!mf.open(it->c_str(), cachestat.st_size)) continue; if (strncmp(mf.begin(), CACHE_MAGIC, strlen(CACHE_MAGIC)) != 0) continue; memcpy(&wordoffset[0], mf.begin() + strlen(CACHE_MAGIC), wordoffset.size()*sizeof(wordoffset[0])); return true; } return false; } strlist_t offset_index::get_cache_variant(const std::string& url) { strlist_t res; res.push_back(url + ".oft"); if (!g_file_test(g_get_user_cache_dir(), G_FILE_TEST_EXISTS) && g_mkdir(g_get_user_cache_dir(), 0700) == -1) return res; std::string cache_dir = std::string(g_get_user_cache_dir()) + G_DIR_SEPARATOR_S + "sdcv"; if (!g_file_test(cache_dir.c_str(), G_FILE_TEST_EXISTS)) { if (g_mkdir(cache_dir.c_str(), 0700) == -1) return res; } else if (!g_file_test(cache_dir.c_str(), G_FILE_TEST_IS_DIR)) return res; gchar *base = g_path_get_basename(url.c_str()); res.push_back(cache_dir + G_DIR_SEPARATOR_S + base + ".oft"); g_free(base); return res; } bool offset_index::save_cache(const std::string& url) { strlist_t vars = get_cache_variant(url); for (strlist_t::const_iterator it = vars.begin(); it != vars.end(); ++it) { FILE *out = fopen(it->c_str(), "wb"); if (!out) continue; if (fwrite(CACHE_MAGIC, 1, strlen(CACHE_MAGIC), out) != strlen(CACHE_MAGIC)) continue; if (fwrite(&wordoffset[0], sizeof(wordoffset[0]), wordoffset.size(), out) != wordoffset.size()) continue; fclose(out); printf("save to cache %s\n", url.c_str()); return true; } return false; } bool offset_index::load(const std::string& url, gulong wc, gulong fsize) { wordcount = wc; gulong npages = (wc - 1) / ENTR_PER_PAGE + 2; wordoffset.resize(npages); if (!load_cache(url)) { //map file will close after finish of block MapFile map_file; if (!map_file.open(url.c_str(), fsize)) return false; const gchar *idxdatabuffer = map_file.begin(); const gchar *p1 = idxdatabuffer; gulong index_size; guint32 j = 0; for (guint32 i = 0; i < wc; i++) { index_size = strlen(p1) + 1 + 2 * sizeof(guint32); if (i % ENTR_PER_PAGE == 0) { wordoffset[j] = p1 - idxdatabuffer; ++j; } p1 += index_size; } wordoffset[j] = p1 - idxdatabuffer; if (!save_cache(url)) fprintf(stderr, "cache update failed\n"); } if (!(idxfile = fopen(url.c_str(), "rb"))) { wordoffset.resize(0); return false; } first.assign(0, read_first_on_page_key(0)); last.assign(wordoffset.size() - 2, read_first_on_page_key(wordoffset.size() - 2)); middle.assign((wordoffset.size() - 2) / 2, read_first_on_page_key((wordoffset.size() - 2) / 2)); real_last.assign(wc - 1, get_key(wc - 1)); return true; } inline gulong offset_index::load_page(glong page_idx) { gulong nentr = ENTR_PER_PAGE; if (page_idx == glong(wordoffset.size() - 2)) if ((nentr = wordcount % ENTR_PER_PAGE) == 0) nentr = ENTR_PER_PAGE; if (page_idx != page.idx) { page_data.resize(wordoffset[page_idx + 1] - wordoffset[page_idx]); fseek(idxfile, wordoffset[page_idx], SEEK_SET); fread(&page_data[0], 1, page_data.size(), idxfile); page.fill(&page_data[0], nentr, page_idx); } return nentr; } const gchar *offset_index::get_key(glong idx) { load_page(idx / ENTR_PER_PAGE); glong idx_in_page = idx % ENTR_PER_PAGE; wordentry_offset = page.entries[idx_in_page].off; wordentry_size = page.entries[idx_in_page].size; return page.entries[idx_in_page].keystr; } void offset_index::get_data(glong idx) { get_key(idx); } const gchar *offset_index::get_key_and_data(glong idx) { return get_key(idx); } bool offset_index::lookup(const char *str, glong &idx) { bool bFound = false; glong iFrom; glong iTo = wordoffset.size() - 2; gint cmpint; glong iThisIndex; if (stardict_strcmp(str, first.keystr.c_str()) < 0) { idx = 0; return false; } else if (stardict_strcmp(str, real_last.keystr.c_str()) > 0) { idx = INVALID_INDEX; return false; } else { iFrom = 0; iThisIndex = 0; while (iFrom <= iTo) { iThisIndex = (iFrom + iTo) / 2; cmpint = stardict_strcmp(str, get_first_on_page_key(iThisIndex)); if (cmpint > 0) iFrom = iThisIndex + 1; else if (cmpint < 0) iTo = iThisIndex - 1; else { bFound = true; break; } } if (!bFound) idx = iTo; //prev else idx = iThisIndex; } if (!bFound) { gulong netr = load_page(idx); iFrom = 1; // Needn't search the first word anymore. iTo = netr - 1; iThisIndex = 0; while (iFrom <= iTo) { iThisIndex = (iFrom + iTo) / 2; cmpint = stardict_strcmp(str, page.entries[iThisIndex].keystr); if (cmpint > 0) iFrom = iThisIndex + 1; else if (cmpint < 0) iTo = iThisIndex - 1; else { bFound = true; break; } } idx *= ENTR_PER_PAGE; if (!bFound) idx += iFrom; //next else idx += iThisIndex; } else { idx *= ENTR_PER_PAGE; } return bFound; } wordlist_index::~wordlist_index() { g_free(idxdatabuf); } bool wordlist_index::load(const std::string& url, gulong wc, gulong fsize) { gzFile in = gzopen(url.c_str(), "rb"); if (in == NULL) return false; idxdatabuf = (gchar *)g_malloc(fsize); gulong len = gzread(in, idxdatabuf, fsize); gzclose(in); if (len != fsize) return false; wordlist.resize(wc + 1); gchar *p1 = idxdatabuf; guint32 i; for (i = 0; i < wc; i++) { wordlist[i] = p1; p1 += strlen(p1) + 1 + 2 * sizeof(guint32); } wordlist[wc] = p1; return true; } const gchar *wordlist_index::get_key(glong idx) { return wordlist[idx]; } void wordlist_index::get_data(glong idx) { gchar *p1 = wordlist[idx] + strlen(wordlist[idx]) + sizeof(gchar); wordentry_offset = g_ntohl(*reinterpret_cast(p1)); p1 += sizeof(guint32); wordentry_size = g_ntohl(*reinterpret_cast(p1)); } const gchar *wordlist_index::get_key_and_data(glong idx) { get_data(idx); return get_key(idx); } bool wordlist_index::lookup(const char *str, glong &idx) { bool bFound = false; glong iTo = wordlist.size() - 2; if (stardict_strcmp(str, get_key(0)) < 0) { idx = 0; } else if (stardict_strcmp(str, get_key(iTo)) > 0) { idx = INVALID_INDEX; } else { glong iThisIndex = 0; glong iFrom = 0; gint cmpint; while (iFrom <= iTo) { iThisIndex = (iFrom + iTo) / 2; cmpint = stardict_strcmp(str, get_key(iThisIndex)); if (cmpint > 0) iFrom = iThisIndex + 1; else if (cmpint < 0) iTo = iThisIndex - 1; else { bFound = true; break; } } if (!bFound) idx = iFrom; //next else idx = iThisIndex; } return bFound; } //=================================================================== bool Dict::load(const std::string& ifofilename) { gulong idxfilesize; if (!load_ifofile(ifofilename, idxfilesize)) return false; std::string fullfilename(ifofilename); fullfilename.replace(fullfilename.length() - sizeof("ifo") + 1, sizeof("ifo") - 1, "dict.dz"); if (g_file_test(fullfilename.c_str(), G_FILE_TEST_EXISTS)) { dictdzfile.reset(new dictData); if (!dictdzfile->open(fullfilename, 0)) { //g_print("open file %s failed!\n",fullfilename); return false; } } else { fullfilename.erase(fullfilename.length() - sizeof(".dz") + 1, sizeof(".dz") - 1); dictfile = fopen(fullfilename.c_str(), "rb"); if (!dictfile) { //g_print("open file %s failed!\n",fullfilename); return false; } } fullfilename = ifofilename; fullfilename.replace(fullfilename.length() - sizeof("ifo") + 1, sizeof("ifo") - 1, "idx.gz"); if (g_file_test(fullfilename.c_str(), G_FILE_TEST_EXISTS)) { idx_file.reset(new wordlist_index); } else { fullfilename.erase(fullfilename.length() - sizeof(".gz") + 1, sizeof(".gz") - 1); idx_file.reset(new offset_index); } if (!idx_file->load(fullfilename, wordcount, idxfilesize)) return false; //g_print("bookname: %s , wordcount %lu\n", bookname.c_str(), narticles()); return true; } bool Dict::load_ifofile(const std::string& ifofilename, gulong &idxfilesize) { DictInfo dict_info; if (!dict_info.load_from_ifo_file(ifofilename, false)) return false; if (dict_info.wordcount == 0) return false; ifo_file_name = dict_info.ifo_file_name; wordcount = dict_info.wordcount; bookname = dict_info.bookname; idxfilesize = dict_info.index_file_size; sametypesequence = dict_info.sametypesequence; return true; } bool Dict::LookupWithRule(GPatternSpec *pspec, glong *aIndex, int iBuffLen) { int iIndexCount = 0; for (guint32 i = 0; i < narticles() && iIndexCount < iBuffLen - 1; i++) if (g_pattern_match_string(pspec, get_key(i))) aIndex[iIndexCount++] = i; aIndex[iIndexCount] = -1; // -1 is the end. return (iIndexCount > 0); } //=================================================================== Libs::Libs(progress_func_t f) { progress_func = f; iMaxFuzzyDistance = MAX_FUZZY_DISTANCE; //need to read from cfg. } Libs::~Libs() { for (std::vector::iterator p = oLib.begin(); p != oLib.end(); ++p) delete *p; } void Libs::load_dict(const std::string& url) { Dict *lib = new Dict; if (lib->load(url)) oLib.push_back(lib); else delete lib; } class DictLoader { public: DictLoader(Libs& lib_): lib(lib_) {} void operator()(const std::string& url, bool disable) { if (!disable) lib.load_dict(url); } private: Libs& lib; }; void Libs::load(const strlist_t& dicts_dirs, const strlist_t& order_list, const strlist_t& disable_list) { for_each_file(dicts_dirs, ".ifo", order_list, disable_list, DictLoader(*this)); } class DictReLoader { public: DictReLoader(std::vector &p, std::vector &f, Libs& lib_) : prev(p), future(f), lib(lib_) {} void operator()(const std::string& url, bool disable) { if (!disable) { Dict *dict = find(url); if (dict) future.push_back(dict); else lib.load_dict(url); } } private: std::vector &prev; std::vector &future; Libs& lib; Dict *find(const std::string& url) { std::vector::iterator it; for (it = prev.begin(); it != prev.end(); ++it) if ((*it)->ifofilename() == url) break; if (it != prev.end()) { Dict *res = *it; prev.erase(it); return res; } return NULL; } }; void Libs::reload(const strlist_t& dicts_dirs, const strlist_t& order_list, const strlist_t& disable_list) { std::vector prev(oLib); oLib.clear(); for_each_file(dicts_dirs, ".ifo", order_list, disable_list, DictReLoader(prev, oLib, *this)); for (std::vector::iterator it = prev.begin(); it != prev.end(); ++it) delete *it; } const gchar *Libs::poGetCurrentWord(glong * iCurrent) { const gchar *poCurrentWord = NULL; const gchar *word; for (std::vector::size_type iLib = 0; iLib= narticles(iLib) || iCurrent[iLib] < 0) continue; if ( poCurrentWord == NULL ) { poCurrentWord = poGetWord(iCurrent[iLib], iLib); } else { word = poGetWord(iCurrent[iLib], iLib); if (stardict_strcmp(poCurrentWord, word) > 0 ) poCurrentWord = word; } } return poCurrentWord; } const gchar * Libs::poGetNextWord(const gchar *sWord, glong *iCurrent) { // the input can be: // (word,iCurrent),read word,write iNext to iCurrent,and return next word. used by TopWin::NextCallback(); // (NULL,iCurrent),read iCurrent,write iNext to iCurrent,and return next word. used by AppCore::ListWords(); const gchar *poCurrentWord = NULL; std::vector::size_type iCurrentLib = 0; const gchar *word; for (std::vector::size_type iLib = 0;iLibLookup(sWord, iCurrent[iLib]); if (iCurrent[iLib] == INVALID_INDEX) continue; if (iCurrent[iLib] >= narticles(iLib) || iCurrent[iLib] < 0) continue; if (poCurrentWord == NULL ) { poCurrentWord = poGetWord(iCurrent[iLib], iLib); iCurrentLib = iLib; } else { word = poGetWord(iCurrent[iLib], iLib); if (stardict_strcmp(poCurrentWord, word) > 0 ) { poCurrentWord = word; iCurrentLib = iLib; } } } if (poCurrentWord) { iCurrent[iCurrentLib] ++; for (std::vector::size_type iLib = 0;iLib= narticles(iLib) || iCurrent[iLib] < 0) continue; if (strcmp(poCurrentWord, poGetWord(iCurrent[iLib], iLib)) == 0 ) iCurrent[iLib]++; } poCurrentWord = poGetCurrentWord(iCurrent); } return poCurrentWord; } const gchar * Libs::poGetPreWord(glong * iCurrent) { // used by TopWin::PreviousCallback(); the iCurrent is cached by AppCore::TopWinWordChange(); const gchar *poCurrentWord = NULL; std::vector::size_type iCurrentLib = 0; const gchar *word; for (std::vector::size_type iLib = 0;iLib narticles(iLib) || iCurrent[iLib] <= 0) continue; } if ( poCurrentWord == NULL ) { poCurrentWord = poGetWord(iCurrent[iLib] - 1, iLib); iCurrentLib = iLib; } else { word = poGetWord(iCurrent[iLib] - 1, iLib); if (stardict_strcmp(poCurrentWord, word) < 0 ) { poCurrentWord = word; iCurrentLib = iLib; } } } if (poCurrentWord) { iCurrent[iCurrentLib] --; for (std::vector::size_type iLib = 0;iLib narticles(iLib) || iCurrent[iLib] <= 0) continue; if (strcmp(poCurrentWord, poGetWord(iCurrent[iLib] - 1, iLib)) == 0) { iCurrent[iLib]--; } else { if (iCurrent[iLib] == narticles(iLib)) iCurrent[iLib] = INVALID_INDEX; } } } return poCurrentWord; } bool Libs::LookupSimilarWord(const gchar* sWord, glong & iWordIndex, int iLib) { glong iIndex; bool bFound = false; gchar *casestr; if (!bFound) { // to lower case. casestr = g_utf8_strdown(sWord, -1); if (strcmp(casestr, sWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); // to upper case. if (!bFound) { casestr = g_utf8_strup(sWord, -1); if (strcmp(casestr, sWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } // Upper the first character and lower others. if (!bFound) { gchar *nextchar = g_utf8_next_char(sWord); gchar *firstchar = g_utf8_strup(sWord, nextchar - sWord); nextchar = g_utf8_strdown(nextchar, -1); casestr = g_strdup_printf("%s%s", firstchar, nextchar); g_free(firstchar); g_free(nextchar); if (strcmp(casestr, sWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } } if (bIsPureEnglish(sWord)) { // If not Found , try other status of sWord. int iWordLen = strlen(sWord); bool isupcase; gchar *sNewWord = (gchar *)g_malloc(iWordLen + 1); //cut one char "s" or "d" if (!bFound && iWordLen > 1) { isupcase = sWord[iWordLen - 1] == 'S' || !strncmp(&sWord[iWordLen - 2], "ED", 2); if (isupcase || sWord[iWordLen - 1] == 's' || !strncmp(&sWord[iWordLen - 2], "ed", 2)) { strcpy(sNewWord, sWord); sNewWord[iWordLen - 1] = '\0'; // cut "s" or "d" if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } } } //cut "ly" if (!bFound && iWordLen > 2) { isupcase = !strncmp(&sWord[iWordLen - 2], "LY", 2); if (isupcase || (!strncmp(&sWord[iWordLen - 2], "ly", 2))) { strcpy(sNewWord, sWord); sNewWord[iWordLen - 2] = '\0'; // cut "ly" if (iWordLen > 5 && sNewWord[iWordLen - 3] == sNewWord[iWordLen - 4] && !bIsVowel(sNewWord[iWordLen - 4]) && bIsVowel(sNewWord[iWordLen - 5])) { //doubled sNewWord[iWordLen - 3] = '\0'; if ( oLib[iLib]->Lookup(sNewWord, iIndex) ) bFound = true; else { if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } if (!bFound) sNewWord[iWordLen - 3] = sNewWord[iWordLen - 4]; //restore } } if (!bFound) { if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } } } } //cut "ing" if (!bFound && iWordLen > 3) { isupcase = !strncmp(&sWord[iWordLen - 3], "ING", 3); if (isupcase || !strncmp(&sWord[iWordLen - 3], "ing", 3) ) { strcpy(sNewWord, sWord); sNewWord[iWordLen - 3] = '\0'; if ( iWordLen > 6 && (sNewWord[iWordLen - 4] == sNewWord[iWordLen - 5]) && !bIsVowel(sNewWord[iWordLen - 5]) && bIsVowel(sNewWord[iWordLen - 6])) { //doubled sNewWord[iWordLen - 4] = '\0'; if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else { if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } if (!bFound) sNewWord[iWordLen - 4] = sNewWord[iWordLen - 5]; //restore } } if ( !bFound ) { if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } } if (!bFound) { if (isupcase) strcat(sNewWord, "E"); // add a char "E" else strcat(sNewWord, "e"); // add a char "e" if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } } } } //cut two char "es" if (!bFound && iWordLen > 3) { isupcase = (!strncmp(&sWord[iWordLen - 2], "ES", 2) && (sWord[iWordLen - 3] == 'S' || sWord[iWordLen - 3] == 'X' || sWord[iWordLen - 3] == 'O' || (iWordLen > 4 && sWord[iWordLen - 3] == 'H' && (sWord[iWordLen - 4] == 'C' || sWord[iWordLen - 4] == 'S')))); if (isupcase || (!strncmp(&sWord[iWordLen - 2], "es", 2) && (sWord[iWordLen - 3] == 's' || sWord[iWordLen - 3] == 'x' || sWord[iWordLen - 3] == 'o' || (iWordLen > 4 && sWord[iWordLen - 3] == 'h' && (sWord[iWordLen - 4] == 'c' || sWord[iWordLen - 4] == 's'))))) { strcpy(sNewWord, sWord); sNewWord[iWordLen - 2] = '\0'; if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } } } //cut "ed" if (!bFound && iWordLen > 3) { isupcase = !strncmp(&sWord[iWordLen - 2], "ED", 2); if (isupcase || !strncmp(&sWord[iWordLen - 2], "ed", 2)) { strcpy(sNewWord, sWord); sNewWord[iWordLen - 2] = '\0'; if (iWordLen > 5 && (sNewWord[iWordLen - 3] == sNewWord[iWordLen - 4]) && !bIsVowel(sNewWord[iWordLen - 4]) && bIsVowel(sNewWord[iWordLen - 5])) { //doubled sNewWord[iWordLen - 3] = '\0'; if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else { if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } if (!bFound) sNewWord[iWordLen - 3] = sNewWord[iWordLen - 4]; //restore } } if (!bFound) { if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } } } } // cut "ied" , add "y". if (!bFound && iWordLen > 3) { isupcase = !strncmp(&sWord[iWordLen - 3], "IED", 3); if (isupcase || (!strncmp(&sWord[iWordLen - 3], "ied", 3))) { strcpy(sNewWord, sWord); sNewWord[iWordLen - 3] = '\0'; if (isupcase) strcat(sNewWord, "Y"); // add a char "Y" else strcat(sNewWord, "y"); // add a char "y" if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } } } // cut "ies" , add "y". if (!bFound && iWordLen > 3) { isupcase = !strncmp(&sWord[iWordLen - 3], "IES", 3); if (isupcase || (!strncmp(&sWord[iWordLen - 3], "ies", 3))) { strcpy(sNewWord, sWord); sNewWord[iWordLen - 3] = '\0'; if (isupcase) strcat(sNewWord, "Y"); // add a char "Y" else strcat(sNewWord, "y"); // add a char "y" if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } } } // cut "er". if (!bFound && iWordLen > 2) { isupcase = !strncmp(&sWord[iWordLen - 2], "ER", 2); if (isupcase || (!strncmp(&sWord[iWordLen - 2], "er", 2))) { strcpy(sNewWord, sWord); sNewWord[iWordLen - 2] = '\0'; if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } } } // cut "est". if (!bFound && iWordLen > 3) { isupcase = !strncmp(&sWord[iWordLen - 3], "EST", 3); if (isupcase || (!strncmp(&sWord[iWordLen - 3], "est", 3))) { strcpy(sNewWord, sWord); sNewWord[iWordLen - 3] = '\0'; if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } } } g_free(sNewWord); } if (bFound) iWordIndex = iIndex; #if 0 else { //don't change iWordIndex here. //when LookupSimilarWord all failed too, we want to use the old LookupWord index to list words. //iWordIndex = INVALID_INDEX; } #endif return bFound; } bool Libs::SimpleLookupWord(const gchar* sWord, glong & iWordIndex, int iLib) { bool bFound = oLib[iLib]->Lookup(sWord, iWordIndex); if (!bFound) bFound = LookupSimilarWord(sWord, iWordIndex, iLib); return bFound; } struct Fuzzystruct { char * pMatchWord; int iMatchWordDistance; }; inline bool operator<(const Fuzzystruct & lh, const Fuzzystruct & rh) { if (lh.iMatchWordDistance != rh.iMatchWordDistance) return lh.iMatchWordDistance < rh.iMatchWordDistance; if (lh.pMatchWord && rh.pMatchWord) return stardict_strcmp(lh.pMatchWord, rh.pMatchWord) < 0; return false; } static inline void unicode_strdown(gunichar *str) { while (*str) { *str = g_unichar_tolower(*str); ++str; } } bool Libs::LookupWithFuzzy(const gchar *sWord, gchar *reslist[], gint reslist_size, gint iLib) { if (sWord[0] == '\0') return false; Fuzzystruct *oFuzzystruct = new Fuzzystruct[reslist_size]; for (int i = 0; i < reslist_size; i++) { oFuzzystruct[i].pMatchWord = NULL; oFuzzystruct[i].iMatchWordDistance = iMaxFuzzyDistance; } int iMaxDistance = iMaxFuzzyDistance; int iDistance; bool Found = false; EditDistance oEditDistance; glong iCheckWordLen; const char *sCheck; gunichar *ucs4_str1, *ucs4_str2; glong ucs4_str2_len; ucs4_str2 = g_utf8_to_ucs4_fast(sWord, -1, &ucs4_str2_len); unicode_strdown(ucs4_str2); // for (std::vector::size_type iLib = 0; iLib=0 && stardict_strcmp(sWord, poGetWord(narticles(iLib)-1,iLib))<=0) { //there are Chinese dicts and English dicts... if (TRUE) { const int iwords = narticles(iLib); for (int index = 0; index < iwords; index++) { sCheck = poGetWord(index, iLib); // tolower and skip too long or too short words iCheckWordLen = g_utf8_strlen(sCheck, -1); if (iCheckWordLen - ucs4_str2_len >= iMaxDistance || ucs4_str2_len - iCheckWordLen >= iMaxDistance) continue; ucs4_str1 = g_utf8_to_ucs4_fast(sCheck, -1, NULL); if (iCheckWordLen > ucs4_str2_len) ucs4_str1[ucs4_str2_len] = 0; unicode_strdown(ucs4_str1); iDistance = oEditDistance.CalEditDistance(ucs4_str1, ucs4_str2, iMaxDistance); g_free(ucs4_str1); if (iDistance < iMaxDistance && iDistance < ucs4_str2_len) { // when ucs4_str2_len=1,2 we need less fuzzy. Found = true; bool bAlreadyInList = false; int iMaxDistanceAt = 0; for (int j = 0; j < reslist_size; j++) { if (oFuzzystruct[j].pMatchWord && strcmp(oFuzzystruct[j].pMatchWord, sCheck) == 0 ) { //already in list bAlreadyInList = true; break; } //find the position,it will certainly be found (include the first time) as iMaxDistance is set by last time. if (oFuzzystruct[j].iMatchWordDistance == iMaxDistance ) { iMaxDistanceAt = j; } } if (!bAlreadyInList) { if (oFuzzystruct[iMaxDistanceAt].pMatchWord) g_free(oFuzzystruct[iMaxDistanceAt].pMatchWord); oFuzzystruct[iMaxDistanceAt].pMatchWord = g_strdup(sCheck); oFuzzystruct[iMaxDistanceAt].iMatchWordDistance = iDistance; // calc new iMaxDistance iMaxDistance = iDistance; for (int j = 0; j < reslist_size; j++) { if (oFuzzystruct[j].iMatchWordDistance > iMaxDistance) iMaxDistance = oFuzzystruct[j].iMatchWordDistance; } // calc new iMaxDistance } // add to list } // find one } // each word } // ok for search // } // each lib g_free(ucs4_str2); if (Found) // sort with distance std::sort(oFuzzystruct, oFuzzystruct + reslist_size); for (gint i = 0; i < reslist_size; ++i) reslist[i] = oFuzzystruct[i].pMatchWord; delete[] oFuzzystruct; return Found; } inline bool less_for_compare(const char *lh, const char *rh) { return stardict_strcmp(lh, rh) < 0; } gint Libs::LookupWithRule(const gchar *word, gchar **ppMatchWord) { glong aiIndex[MAX_MATCH_ITEM_PER_LIB + 1]; gint iMatchCount = 0; GPatternSpec *pspec = g_pattern_spec_new(word); for (std::vector::size_type iLib = 0; iLib LookupWithRule(pspec, aiIndex, MAX_MATCH_ITEM_PER_LIB + 1)) { if (progress_func) progress_func(); for (int i = 0; aiIndex[i] != -1; i++) { const gchar * sMatchWord = poGetWord(aiIndex[i], iLib); bool bAlreadyInList = false; for (int j = 0; j < iMatchCount; j++) { if (strcmp(ppMatchWord[j], sMatchWord) == 0) { //already in list bAlreadyInList = true; break; } } if (!bAlreadyInList) ppMatchWord[iMatchCount++] = g_strdup(sMatchWord); } } } g_pattern_spec_free(pspec); if (iMatchCount) // sort it. std::sort(ppMatchWord, ppMatchWord + iMatchCount, less_for_compare); return iMatchCount; } bool Libs::LookupData(const gchar *sWord, std::vector *reslist) { std::vector SearchWords; std::string SearchWord; const char *p = sWord; while (*p) { if (*p == '\\') { p++; switch (*p) { case ' ': SearchWord += ' '; break; case '\\': SearchWord += '\\'; break; case 't': SearchWord += '\t'; break; case 'n': SearchWord += '\n'; break; default: SearchWord += *p; } } else if (*p == ' ') { if (!SearchWord.empty()) { SearchWords.push_back(SearchWord); SearchWord.clear(); } } else { SearchWord += *p; } p++; } if (!SearchWord.empty()) { SearchWords.push_back(SearchWord); SearchWord.clear(); } if (SearchWords.empty()) return false; guint32 max_size = 0; gchar *origin_data = NULL; for (std::vector::size_type i = 0; i containSearchData()) continue; if (progress_func) progress_func(); const gulong iwords = narticles(i); const gchar *key; guint32 offset, size; for (gulong j = 0; j < iwords; ++j) { oLib[i] ->get_key_and_data(j, &key, &offset, &size); if (size > max_size) { origin_data = (gchar *)g_realloc(origin_data, size); max_size = size; } if (oLib[i]->SearchData(SearchWords, offset, size, origin_data)) reslist[i].push_back(g_strdup(key)); } } g_free(origin_data); std::vector::size_type i; for (i = 0; i #include "stardict.h" SettingsDialog::SettingsDialog(StarDict *plugin, QWidget *parent) : QDialog(parent), m_plugin(plugin) { setupUi(this); reformatListsBox->setChecked(m_plugin->m_reformatLists); expandAbbreviationsBox->setChecked(m_plugin->m_expandAbbreviations); dictDirsList->addItems(m_plugin->m_dictDirs); connect(this, SIGNAL(accepted()), SLOT(apply())); } void SettingsDialog::on_addDictDirButton_clicked() { QString dirName = QFileDialog::getExistingDirectory(this, tr("Select dictionaries directory")); if (! dirName.isEmpty()) { dictDirsList->addItem(dirName); } } void SettingsDialog::on_removeDictDirButton_clicked() { delete dictDirsList->takeItem(dictDirsList->currentRow()); } void SettingsDialog::on_moveUpDictDirButton_clicked() { if (dictDirsList->currentRow() > 0) { dictDirsList->insertItem(dictDirsList->currentRow(), dictDirsList->takeItem(dictDirsList->currentRow())); dictDirsList->setCurrentRow(dictDirsList->currentRow() - 1); } } void SettingsDialog::on_moveDownDictDirButton_clicked() { if (dictDirsList->currentRow() < dictDirsList->count() - 1) dictDirsList->insertItem(dictDirsList->currentRow(), dictDirsList->takeItem(dictDirsList->currentRow() + 1)); } void SettingsDialog::apply() { m_plugin->m_reformatLists = reformatListsBox->isChecked(); m_plugin->m_expandAbbreviations = expandAbbreviationsBox->isChecked(); m_plugin->m_dictDirs.clear(); for (int i = 0; i < dictDirsList->count(); ++i) m_plugin->m_dictDirs << dictDirsList->item(i)->text(); } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-0.12.9.orig/plugins/web/0000755000175000017500000000000011023552371015441 5ustar alexalexqstardict-0.12.9.orig/plugins/web/adddictionarydialog.ui0000644000175000017500000000662411023552133022002 0ustar alexalex AddDictionaryDialog 0 0 377 238 Add dictionary Name: Author: Description: HTTP query: <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The '%s' template will be replace to word.</p></body></html> HTML charset: Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok buttonBox accepted() AddDictionaryDialog accept() 227 217 157 237 buttonBox rejected() AddDictionaryDialog reject() 295 223 286 237 qstardict-0.12.9.orig/plugins/web/settingsdialog.ui0000644000175000017500000001065311023552133021021 0ustar alexalex SettingsDialog 0 0 354 295 Web plugin settings Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok Dictionaries 9 9 9 9 6 6 6 0 0 0 0 Edit dictionary Edit :/icons/edit.png Add dictionary Add :/icons/list-add.png Remove dictionary Remove :/icons/list-remove.png Qt::Horizontal 342 26 buttonBox accepted() SettingsDialog accept() 227 311 157 274 buttonBox rejected() SettingsDialog reject() 295 317 286 274 qstardict-0.12.9.orig/plugins/web/web.pro0000644000175000017500000000315011023552133016733 0ustar alexalex############################################################################# # web.pro - QStarDict, a StarDict clone written with using Qt # # Copyright (C) 2008 Alexander Rodin # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License along # # with this program; if not, write to the Free Software Foundation, Inc., # # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # ############################################################################# TARGET = web include(../plugin.pri) HEADERS += \ settingsdialog.h \ web.h SOURCES += \ settingsdialog.cpp \ web.cpp FORMS += \ adddictionarydialog.ui \ settingsdialog.ui RESOURCES += \ pixmaps/pixmaps.qrc qstardict-0.12.9.orig/plugins/web/pixmaps/0000755000175000017500000000000011023552371017122 5ustar alexalexqstardict-0.12.9.orig/plugins/web/pixmaps/edit.png0000644000175000017500000001721611023552133020560 0ustar alexalexPNG  IHDR>asRGBbKGD pHYs B(xtIME ,3$[IDATxy|SeYrN{ @Ȱ::aTd2. :#E@:#˕]qapŅBWIv9! i'iK~>/I7)F}oA"\OI}|]>dnm*Ѽz@6}Vel\ QVKhM$}b;㎩ϯw/}cFL,@0fT2KBt?BHs8?V.LH93,&Bi t/x~f(=R}[m\(trsL>ja'A-n R$|- \i}4# nK]@@@"t dA8Gkz ajz&?L=. jwQ7D>'V tG.H-B,\vGZ!}?1 x jj bhGÂkD@hU"e.3n R'Qj{$~D1 5nD =ǿN[|. C`\o@Duse?. JQB&l ցр4t#B #QA|~?Z=C: ?b G[#N '$2#!;pִ J_Xh,bXP`$YOAV`7C$|h=h7 x={v㾻oGTv?CX Go:%xxlXbDIȠiz 0aZxSn ?RLկbضҰ@Cy$kh ^x?c|͌׬o;p t4Slc}0܀/<6[DZZZ~`*~[֡ (;|λ׍=gn O͂$IP4K"~~d *$P<+~wOQvFO e4F[X c n+ޚkĂ* d9R\0rHHa42^)H5܂ 1P`D)Xq2qȲNQo^Hc[1HK6 WLـ$)r0i4MaY4&=&A`pXw_l݂i0Y Up)0YYҰR3 À5`2hC ~0cL~kk+dp`ͩ,>;k&5<8g "}Iv(܀iƮ0)r*P 9%]8pIQ,f3x~= #A`԰Ä,w$Unp p ,d1b, ,~/*^:j |8}=@z26^:rllڲ fVg6"p4ݠ/ =Au~C7W c.Nw`dYjz#_H`c|5 J3X[wkA:^}|҄ Ȳݸ+`ZaXq\!h{jz03Vķ e||9)qH@U,<3`X`>=A`~?RUQ%MAZGa H›  &MxNsH["Xp@z LҭHn^1҃Տ"1%V5@iz{z*hxߏ4T|O~i6WOIck!yXEi'=ޚF=m_jC:*  6O"HaQR7s G4TY|R4 ք x?|#:yhM}{>y[ md830㵖fYŌԦg Y nC_ٷU %+ N p7!o]P) Rb4[ n2X'ѯeXxյX{6ll6v$$$nj{K x О{Z  im([C4$*oʵ Ok?!! W:,iO@)$&X YV<@Yq+ gQ[SNm!AP{g_S힇D/ }YjAg2Ip3 A ;U(8|]l6[; P쳀("G&*wWP(<7RX類̗AX`}v/ 0Jӯ*n _"aE"i 9)Κs*@SY|8Ƭ16E$ >;m xՁ;~jX_*_E `f;_/:@9E_=g}1xlIq0;?Cad7|?!^(YK ؑ@$ f\gni s)m5fȣ ͿfY_BmVd$@8<~}xRp5A$)8pTOb>/ݳl. =S >/~0Me(~22/]c+6~k.nWd&ʰxo;W/=x7r;h , WE׳܌DS*`gKl=\+PM?-'k _(݋B bsBH;_wSԜ،"9%%֌^xA9(*85Y Q]ahCv\ Gb‚g 3 @[p>8`9Gz7y +z&Ptsʷ炫~ 0{@|Ht/ `o xh>G6 B ۑW3X&==k?f!Xa8J`ޟR/O_:,j݆"x" gGi8<02#))WK0ن|/)ǵx]tM@S8DX* ʴZT4tl6sB]xL|ݽH6xbȡjy?.`]58q"X  mO({lU"ѵ\B*MML JcDo`G]!ĐPL,iđOn,!<bʌjY A1cDPp&/w ~p^魛,9dƨbLy,[νQޒyȶ~ ^BsշXiXE-]v30zo6TEıM0 lFu}< `GKxgC\`Ʒ+(F:ߞ%m?Tt@Ue=8[$ y"NUK{lN>K7\ ayAfuk~[@p?Q!( jO|0;%l>5^r Ik>/0 8k'N^#~&>ضGPu|5 aq E<7yhYVJm(LM0Er}La{[EQڄ7(|{')jJ/˜V{&fr~gߟ"a"h/.'wusPߞtNh(+]w>F`ud๵uލ.ǟf{vlӓ@1ltή0('E2D]֘{o7G eascѿb͝+ǏwWCqx?d¤{Vtut-,ɲb72 br Dq;zZ\5j(=w6;z(/,qUxlʼtZP ,AS[jkC \I@( Ҁ$CTUߊn_B#WW>4 o(xi?TEAIP O~;|)I6 v7)la ҢMP@J̑HŊ- ו8d HDz7Up2?4 ao ~$CÅxQ d) (2E 8O#k EY`vVw=nmm % .#;RnkutԔDywlnB,w9 eCQ`a|-,CEIYI4 8@2]>@4xRC kZ^}8qDeg-Q`'b[eTÆ˞C B[u&Aeee^-oTcߖݫ2DI +jD* i*)p8hmCm}v?|#%^PEg2'S9_4/A&T?`2 H~w _#Q:'hdgTUE04̬̂,hjj@m]S/^( /`Q9A@ItjAMD(lhUEQy HLL yZ?pmx}[Y 2$Qx?OKMŠA Vu8x<3߮|Ri8 fO҉[ْ|ߞ=`Y u#C( (k2b69樎iW5;7--p\"Y|*d EQa4x fel6?hm G>2\nkWd Qɥ?,*\/QAcTԝ%TКf|>?!.(_z]=hiiFsSZ].HZ K(-Vdfd`/{9'?XR֮7\5gi'$dAfU^pSX>sW)xVD}F|{(`_G۷pDS8~JxxDZ[]p\p67CаZ$$8#9)I{Moa(Ғ][~Oaa'Mszq8q3lʿL ˲[|߿/xwϨ8bpm_i7S? #BQ͔=eeGb۷oo|}tZٕ %p88iȐ!Cp!n,  HrތXu8la*hZ,Zv.{]Qo}+2$\eWէG,{@Gb]G̛xj}\-]s]y\Bii)fϞ#G -- )))iUz LT@;zt*,˂Ak/I",K MM8EEjJr$Ţ;Ι%^:u{7&\D{_k*rع#4MC=OVMV!,{jH:Y G۷&}#^Wd 333,rqQٳN-_Y+p:֐?e\(5 ^^jMmKR8|AeLŎ6W7{d$z7zfW 5k~Tzz;C=hllD}]~梦z| t:޳)k .!>?#t 5zxM *|͙=׻QgΜi0a999u/ɓAAT,g~w.kS֛;4/XLwW +^ve,k[@j~QqY3o~6ԩSܼ|PE45BQTj6lj$`,D(.. PU5@kTHN)k(pp\p]p].n_'L 2+z据VUVm-,,;mڴz'--6MN޶#Y|mJ0m(B!;{p{¢{R[;@1c9xwpomJEQ`Uɣ7vz" *Tdgg]Pt9OWw*[9x6DM$]˶E ` NTOUT(]"ϯh/țabKGD pHYs B(xtIME #E< IDATx}yx}$@RD|R_qj׶Vnnw[{u44i64&Ol8%Qmqb[-ڭ[)IM@̷ `%{*CiG:`:5k@$v[pPY(3>Bg>v#&[l`[`xM8f7S*$v; @`EqAHBN/#Y'b7 2򲹒Rt ?s 8=K3 !t䄙iO@.>0ˉ@?v|C%&<T^5/ϡ@&Sޓ)0'7f:L@089t9"Ț̫&K o [o&m*/JÂA>c`s; o](1=GLɒ)5P~4;'28bK2g/="z~`髊 WIJYw?L+;%e.zϓ\Y"!fSnUAK 'Kk~6B UG#]`?' 07b׉G )Gk@$8  Hlgc(Εhj|6f^sBY @bfNx y?ʕV@JP@юfb!ee:X'Eƀk1 Y̾tȈ']w+6DҊ&mpu.)&7khʠ_֙ `1L|%w|d0h#e} Ÿ֝'fQk`n4xW_ 5*7n@uG 5ÿy>2u@yaM!=G,, dԶ{7EoNC :1{ٕ>kB(vf8>g0R]=ug1^ov:a@d*^JZca:ƦfS.DUSѧg?\^4mUtXtPtϽ A~|c<׏?0( {b(qMߟ>dL@e-`-Y)D4JJ`ٲdhL>&*byy~؊O]ukӈu;&0>Q5;hۉZq؁d*nj@]wCi47_ `w4xfWr#TyF#˵oR~-]nmT_ukJ}&0y޾fVǝ2p<~x>K)?e5OJND[T P[)Ɍ~(Cwjuu(ٰCB=8X*Ӑh1#Gs |0l&>Tlg.!81Skܐ k@m la#J+M\Uu.R~Pxgކ-E*UJ([:Rd%F< "DM\ D%H pY,4_7;\:>8qT-̀O`;~l `:АV@ɍ7b/8vӘCbLwc~-qKԤ |0UV}^Xd]._=!Ѽvk@EEPY|(`ʗPS ?Z;_=VנluTq>Sf_cw&Qx?1O]̸><ڢ*#|3БpUU``2Oc,[[3?\qqLcn0^~|U7&y|.H/`n |0U+A+'1Q@`-CEMMQJ8==3.#jtT5*R{g +{4c<>/Ĕb{1rA: V*ޏ/j0ajY.IsT[;7e`lnI8aF?嬁/#sCI݇twyo5(wNtd |) |1M7Cc#bf>tͪksN InyT ja2`^ԩl/FdCT $EIЛ#'NOѱ@Vwb/<ܣT#"a` Y8d)\ema! յI*{k\ߏvAL ><uU(9"Ѓ}x@Y{[R2TV*L0껾6 P0< U2;:V^vL9 O9mWjnnFǁ(u|0WVI3z!Pp@g*h֑1O +dлkgnI0gQo**aknPl6g#ۖbk= bJ ^vl/.z>EfRQW9/ePc*WlRQAR]xye5C v*AәC;|c%l-j_`-|hKV>n[ 8L1Cu5g$JzLZ>]gJ6l:NwNAl|!+f~Jږ+R^wyq(jy Q&._4͞VlM(["ܙC%P9Բ.|xhNR+4 B!6dH<d;"r;g[$j v@r::رޮ\`HO`v:s.l)>& "|f3H@ 7fz*.C٥0idk{htb67iAM11VƑ.lmIZR獛ZL}i <e"(٘}/ ~zwiokq&^g( SߩHLaJ_"2i-AOi aoi}~؞%XT𛛢v\c|F BHt37X qJj'' :Uax ;`onT\ [[`u6 aTOFW$x LMBky8ÚT}6&s89  PQ/Z{qS}2߇Ѿ7G`!wuzct_OM_P-y*E5; =67I@CkAYS>zo[RJNX'4V$Ԅ[ Px/q5Z"X?6 azi,\Y*ID~,xгk">/X' rT.R13EEMe RoV? atB Ie('ugTMU(kSޮ.!&y( ֆ:'%MZ\81^ g:`L}&W3Le ^H^ݷTÔ+^|ٶ/O_;aTv߳PŒacDq1k`E1o&J:(vOB8_~o` |^fGSȼ9[kvu/x0A2&HZx_r kuϐT |;3%H~YS=Zܩr$D OXqVl`v|>~e9ddWVe@ {KXƛ RwM$c َD^tJo>ŠIJ/_!DpDq&c0av,8R*Ap#ގ={s~ƍh߷_̠[#+yQCA,X(J2:X:@oRC8$:>/D9!}!q+^~2Lw-& \CqDNqPt泂M5"YrgybP/" a F!䟕 kCǡ_TQ(QH}0Ax\Ct?@p8 8K|߉3Vw" aݲ Lq3>ȅg2dFt6ۢJ6~ZTbBM13<<ɠgAxd! dv\{K"Y,D" !<Υ܊/PZzY2%?js0=4$Tqb+h0>Ppypc}Cq۝w\Q.gKLa 2)ǝ̆ley0F\Ò{"݄gk@r_" jǵyWFYD 'gpcnʼn+> CsG$&oVGIK$8C2Y5=8O$v\pJp\£C]v\/8~D6Ԋ;ӟ.9S.7fJ=Mk udyRܟf@Y)X!rsvxV':I#}Ki0]++ Dj`dlc}.5>g:ޮv\% `5$izJ;}i=}7D]SDY. w_u=۶gܒ`Yl2L {X P6 ΂z  "|~]P-=$?s 'ѳ}x,z妲dFwjD ɖq'F)PHmx+~ _櫹۷5" IpRf…Y#&l.Ui/&\bAd94=ms6z "4;u>=`*;.\ Hnx+>}XT/ z]ִA/UD,F`j@62?@#,:ؔƳ~l1 ɓE KivFL7rݷl8H;NY>;>aF#Ǩضmo˸q`z`PqCq1;夼,VZ؛`mKȣ8S5YW1).JL,c/(@ۿlqo66lu7֫F{;>~deOKZ(,@ҽ}~xsf3V9mޜ[%jikVf;`oZ$ЏL ! az6g<0ӍA$.J/l`=uW$VX[ 4D4\Hnf`0moĤNm/~z8;RPQW~v=9z4dF,egd_J8?NiћK6Ȏs}[|CM SY u7K~a^ r@\O}KI6DunU9'@z&YeS{}Y#.HZq%, <6?sϋkpЅͤ%}N5kIU֜ ) Ӭd @i#%vv ,g྘n5kE[ , كֆYwe/(GUi1L5V 6%fP baxfdZVĪ+" onNNSRh%➹B,b(.Fi%_nu7j#S >_Jʕms}f_r~{s~UzҬ֦ؗ7 0qB \C~n5+qjoE#A ~Le: `P]6@g*ҭf%Pվ"IvgGO?Ao XobBJ;n#4)@`a9<ӲsZV>ABɓT=Do9W`q9v;PRe e q:VRf}8?_L kc}VR?X(K9~ ,||{d, r[@!9#~UTWG89Mj5 ħf8_} ''Ã?況[VKmݛj'Pd?QxM-N,zMh01 f Z| OlcA`ғ|Ūb &߫@K?' 3)? >|c͡6g# EzZ3 OB~?Lf Vv(=U䢿9!Ȗ{FUc\ƌŏ G!4O&r> /l~_ 'q{F01uvW4b>OYW>TsEߑ<?ٻ. or{T@֚/Eu21uDԕ?6 MhbYCK-U֊\&]޵@+?a =U+Jͱ{߱Yu=@|u%6uL؞7`/vvv/>-I/ld׶ρ pUǞzot/l@10Uk׿.,d鷱[n9zm@B-b{=|+ rk2'< j uxo4+q` A\v61^n/A8Pi$ edit.png list-add.png list-remove.png qstardict-0.12.9.orig/plugins/web/pixmaps/list-add.png0000644000175000017500000001537211023552133021335 0ustar alexalexPNG  IHDR>abKGD pHYs B(xtIME # fpIDATx]{ř}y?5#AQ4Y%p=Q1l6FyqbA$&ٳwr4nr5FTD bQ 30v}}uWW;3SVw}Q@JTD%*QJTD%:kΜiDt:CdM A\c:pa"@@f̌_[QJM&6<0;s ^}.b3v3/ђq-a2"`1Ԣ>e6R ;詘)|o>aƵ ,96Q OԟeDo2a14K/QI"3g 7X QFb9g~O wl߾$8kNDa9~ @e@;v>ܓ%Ag~ 7zMM5ЀƆF!H XD0883Dqtvv 8T@;/>̳%Ymm3%}\x&Nf477eR3<:J#bŁwBww0$󭔌_ߍ={@2{@ /~,5.c; /<¬>Y>9fHcؽ ߡ|[ 2U۶m@k{ fO³ =lΚX,™wVSh_4ص{7^}5{c~Nx޾XPa٘ڊj:DGx ~uzu  % l +s#B+ 3ui8yK `>&Ǟ^ع{q=R_$ X'r {zUkjjp…8yʔw&];^x=xeU[Ǐpt}ヒ;wرcVBy'cb_`Fu}㿑<}4|ҥf3ҟSzp/~crh3RbH;,̨ŌiۋN ?u1|睧͟X5kra``_L9P[ƳGtuuzꩂ:KiJֳ֧j[X -Xi:2W?*_zR柷׹jkqх1RJx\U'8Ւd0TyȬp1c/hwb2{ e$ 7)XK y'553.EC}X2XJ0RJHcl]Ē!%Cr\?wH)쬳KfcE)Ri]{X,>E-XuU;9ZZZK.A"Qfa”Gt2>}Hi0=dm'H`cĉ1XsW\w\@&R9z*.XZ2˸HLEkYzkKK=g/S/a)Sl2N\vjh[B>JD1JϒY=)'c޼6)j+ygM@Waz0-YGHe˖pQ"qh~IhfX;chE& #:1mҷ̘ڊ 'MA|Ĩ#vN:i,iY.ѦV]^x18nN}27Hg"9R֤Up Wr*vZJ;3քK:jPG1qa9zP:sP1K"ΞJXQ!-*'Pl7>ox;Z꣏.. \ЃY:{6b&{ UW]U; )btu6f$jjjɶD9}K%&OAGQA-Pmd$2Q2 4Vuu58t~ Sl# /> պL?As wj>>j 쨷hWk"̊,NI'iCjҕW^9c@m(cqj" V3gV&Hv* i<%k+k{d7AJq! aGKg0<4(3ҖvdQ2s+vܡ.Zd0fL}r KꋆHޠƪ"7648`&3&uL H3A@% wB-#u0~|zsQ@ /_n ?ŠsTc8S1)ӥL ՓvX'L9bf[aͺE,6gn8;Jɓ'ÿR3|fYUe~6,@BܙQ;' %(3:]v/;S9̈vSp1@f]w"MaMcX ͓&|#M\2,'N.<5ͪ-pUmwęPu{~3~ðǏCYYYEGT$prKs .`Ʋ:\5XEXh]c ĞB%HwlDZ8a"ρ&_(,YQyD"1cxjt.kOjy^K]2F$6 * s1`)Ѐx<@A+WN(Hø@7D[4(ѲjU; dzV! a5:q)?`:ZRPcСC0̡kl* f U!dcc7' aCfxA EHp 0+%ЈÇgCL ZF/l764 /l_͚DPz!w&-f{%-]n(q (-)ls qa, n19S0UdA p:AN@t8o^ͣ;Q^iW5!dT;5 vnCY\=T8V`+W6E&e(N֦Wttv[Z&zrW .#ڈj:yo"!3uXϥt;C!lc)MՕp>r n "i'^ փqrCRT }lv^U5ftoW"Q%x2 Ov"-q-7Vi °}zVC.r+9̋ `+*+-$tqkLM g&Ҫ "!`xadYy9l!@s4tٲSPLXth|@XðA,AK6b1@ ðX, 8~7pM z'|<`BhA2!db+ j׾<| $,sҙ+wuuufxo߾T2)94tx8vӞӉ1m4-R;֓!_{g(L0ָG-۵>Rd=};9+ޜ0$iԎC"@==i3uF,%zzz"c 6gV>Q#ؾ"[ea^nE4mQɡ$; i9ӱc)D3KHDgg'*+*PUU DQF!&Av;c)BIA]eŋ' ,< Q]d8z֩v?L(X46 wfu) Y rs( z\8[$O;(D)^$Jt2E">aߛ)/2#2ǔos y}3a`` [ ;R><|aYhry ӝʊɡ|Ëav(uWD'rr!_]k +?aT }BfWvv^x~{ah"@VϗZ "zC;;64H= 8~* f\a^!z-2{ ¯b?u֝b a`2޻*": AVvopr?DE`݃Jxgd/A&(HxXXG5  KX/&ýODCXB '=  4ސ9v"YvBUwFu2WEk{$:J,Faǽ#XQ+eºBlɠ] , J</ÕݎX/}衇 :8ueY<u>3!Ǿ)'ni- ߯[V-㦓`( h`=P[(#IN~ D0v<:X &=GEGB7œe˖DUփ2r rin "z;>*Ef 1][(ZZ@~ Io /% B9Krќy"WMZW֬}G~ayQxiֈbqkY-/ؿo4Oi~3[լӬZ ]s.sͭ3[5VuºfUc\*58B.|`=ؽIܞo~~M=Гz& /n&U؎Sv<z? {s[iIxfϊ 4dn*vp"{= fZ\#oX/&1cӪUw@ez"S>v|xREA큾 6RttX߽㻩 憺߸FF|7mڸ@`lj 3@D5/#=<=F "{*2%ϭ073w2X|"rOBܲuo{tw-f;8`<~'!V]Qxo|R0 8/@or {0 $!Fi7 ѧ 11<;xsQٟ}AyYEag !$B]JeJjr(J@+{+[Cإo+Pge)Ie|~%-Orz]mix|l0a5H4Act 2ӔCɃɤ}8m۞d7jT~ڑ U r5 LF22O@AL "naFD.Μv18e:ޏ^wh8om?lVS!_dFOsnpQ|"0NN^k00!pO{\BP !|"|l{>6=z(c'B2SDA"LB/-g #(50y!Bl ??~r/, *pa.0D h=nboG$JIENDB`qstardict-0.12.9.orig/plugins/web/web.cpp0000644000175000017500000000755711023552133016734 0ustar alexalex/***************************************************************************** * web.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "web.h" #include #include #include #include #include #include #include #include #include "settingsdialog.h" Web::Web(QObject *parent) : QObject(parent) { } QStringList Web::availableDicts() const { QStringList result = QDir(workPath()).entryList(QStringList("*.webdict"), QDir::Files, QDir::Name); result.replaceInStrings(".webdict", ""); return result; } void Web::setLoadedDicts(const QStringList &dicts) { for (QStringList::const_iterator i = dicts.begin(); i != dicts.end(); ++i) { QString filename = workPath() + "/" + *i + ".webdict"; if (! QFile::exists(filename)) continue; QSettings dict(filename, QSettings::IniFormat); QString query = dict.value("query").toString(); if (! query.isEmpty()) { m_loadedDicts[*i].query = query; m_loadedDicts[*i].codec = dict.value("charset").toByteArray(); } } } Web::DictInfo Web::dictInfo(const QString &dict) { QString filename = workPath() + "/" + dict + ".webdict"; if (! QFile::exists(filename)) return DictInfo(); QSettings dictFile(filename, QSettings::IniFormat); DictInfo info(name(), dict, dictFile.value("author").toString(), dictFile.value("description").toString()); return info; } bool Web::isTranslatable(const QString &dict, const QString &word) { if (! m_loadedDicts.contains(dict)) return false; // TODO Q_UNUSED(word); return true; } Web::Translation Web::translate(const QString &dict, const QString &word) { if (! m_loadedDicts.contains(dict)) return Translation(); QUrl url(m_loadedDicts[dict].query.replace("%s", word)); QEventLoop loop; QHttp http(url.host(), url.port(80), &loop); connect(&http, SIGNAL(done(bool)), &loop, SLOT(quit())); http.get(url.path() + "?" + url.encodedQuery()); loop.exec(); QTextCodec *codec = QTextCodec::codecForName(m_loadedDicts[dict].codec); QString translation; if (codec) translation = codec->toUnicode(http.readAll()); else translation = QString::fromUtf8(http.readAll()); return Translation(dict, word, translation); } int Web::execSettingsDialog(QWidget *parent) { ::SettingsDialog dialog(this, parent); return dialog.exec(); } Q_EXPORT_PLUGIN2(web, Web) // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-0.12.9.orig/plugins/web/settingsdialog.h0000644000175000017500000000503511023552133020631 0ustar alexalex/***************************************************************************** * settingsdialog.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef SETTINGSDIALOG_H #define SETTINGSDIALOG_H #include #include "ui_settingsdialog.h" #include "web.h" class SettingsDialog: public QDialog, public Ui::SettingsDialog { Q_OBJECT public: SettingsDialog(Web *plugin, QWidget *parent = 0); void accept(); private slots: void on_editDictButton_clicked(); void on_addDictButton_clicked(); void on_removeDictButton_clicked(); private: void refresh(); struct Dict { Dict(const QString &a = QString(), const QString &d = QString(), const QString &q = QString(), const QByteArray &c = QByteArray()) : author(a), description(d), query(q), charset(c) { } QString author; QString description; QString query; QByteArray charset; }; QHash m_oldDicts; QHash m_dicts; Web *m_plugin; }; #endif // SETTINGSDIALOG_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent qstardict-0.12.9.orig/plugins/web/web.h0000644000175000017500000000546211023552133016372 0ustar alexalex/***************************************************************************** * web.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef WEB_H #define WEB_H #include #include class Web: public QObject, public QStarDict::DictPlugin { Q_OBJECT Q_INTERFACES(QStarDict::DictPlugin) public: Web(QObject *parent = 0); QString name() const { return "web"; } QString version() const { return "0.01"; } QString description() const { return tr("An experimental plugin for WEB dictionaries.
    Warning: now this plugin is unstable"); } QStringList authors() const { return QStringList("Alexander Rodin "); } Features features() const { return Features(SettingsDialog); } QStringList availableDicts() const; QStringList loadedDicts() const { return m_loadedDicts.keys(); } void setLoadedDicts(const QStringList &dicts); DictInfo dictInfo(const QString &dict); bool isTranslatable(const QString &dict, const QString &word); Translation translate(const QString &dict, const QString &word); int execSettingsDialog(QWidget *parent); friend class SettingsDialog; private: struct QueryStruct { QString query; QByteArray codec; }; QHash m_loadedDicts; }; #endif // WEB_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent qstardict-0.12.9.orig/plugins/web/settingsdialog.cpp0000644000175000017500000001170211023552133021162 0ustar alexalex/***************************************************************************** * settingsdialog.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "settingsdialog.h" #include #include #include #include #include #include "ui_adddictionarydialog.h" namespace { QStringList supportedCharsets() { QList list = QTextCodec::availableCodecs(); QStringList newList; for (QList::const_iterator i = list.begin(); i != list.end(); ++i) newList << *i; return newList; } } SettingsDialog::SettingsDialog(Web *plugin, QWidget *parent) : QDialog(parent), m_plugin(plugin) { setupUi(this); QStringList filenames = QDir(plugin->workPath()).entryList(QStringList("*.webdict"), QDir::Files, QDir::Name); for (QStringList::iterator i = filenames.begin(); i != filenames.end(); ++i) { QSettings dict(plugin->workPath() + "/" + *i, QSettings::IniFormat); m_oldDicts[i->remove(".webdict")] = Dict(dict.value("author").toString(), dict.value("description").toString(), dict.value("query").toString(), dict.value("charset").toByteArray()); } m_dicts = m_oldDicts; refresh(); } void SettingsDialog::on_editDictButton_clicked() { if (dictsList->currentRow() == -1) return; QString dict = dictsList->currentItem()->text(); Ui::AddDictionaryDialog ui; QDialog dialog(this); ui.setupUi(&dialog); dialog.setWindowTitle(tr("Edit dictionary")); ui.nameEdit->setText(dict); ui.authorEdit->setText(m_dicts[dict].author); ui.descEdit->setText(m_dicts[dict].description); ui.queryEdit->setText(m_dicts[dict].query); ui.charsetEdit->addItems(supportedCharsets()); ui.charsetEdit->setCurrentIndex(ui.charsetEdit->findText(m_dicts[dict].charset)); if (dialog.exec() != QDialog::Accepted) return; if (ui.nameEdit->text() != dict) { m_dicts.remove(dict); dict = ui.nameEdit->text(); } m_dicts[dict].author = ui.authorEdit->text(); m_dicts[dict].description = ui.descEdit->toPlainText(); m_dicts[dict].query = ui.queryEdit->text(); m_dicts[dict].charset = ui.charsetEdit->currentText().toAscii(); refresh(); } void SettingsDialog::on_addDictButton_clicked() { Ui::AddDictionaryDialog ui; QDialog dialog(this); ui.setupUi(&dialog); ui.charsetEdit->addItems(supportedCharsets()); ui.charsetEdit->setCurrentIndex(ui.charsetEdit->findText("UTF-8")); if (dialog.exec() != QDialog::Accepted) return; m_dicts[ui.nameEdit->text()] = Dict(ui.authorEdit->text(), ui.descEdit->toPlainText(), ui.queryEdit->text()); refresh(); } void SettingsDialog::on_removeDictButton_clicked() { QListWidgetItem *item = dictsList->takeItem(dictsList->currentRow()); m_dicts.remove(item->text()); delete item; } void SettingsDialog::refresh() { dictsList->clear(); dictsList->insertItems(0, m_dicts.keys()); } void SettingsDialog::accept() { for (QHash::const_iterator i = m_dicts.begin(); i != m_dicts.end(); ++i) { QSettings dict(m_plugin->workPath() + "/" + i.key() + ".webdict", QSettings::IniFormat); dict.setValue("author", i->author); dict.setValue("description", i->description); dict.setValue("query", i->query); dict.setValue("charset", i->charset); m_oldDicts.remove(i.key()); } for (QHash::const_iterator i = m_oldDicts.begin(); i != m_oldDicts.end(); ++i) QFile::remove(m_plugin->workPath() + "/" + i.key() + ".webdict"); QDialog::accept(); } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-0.12.9.orig/plugins/plugins.pro0000644000175000017500000000265011023552133017066 0ustar alexalex############################################################################# # plugins.pro - QStarDict, a StarDict clone written with using Qt # # Copyright (C) 2008 Alexander Rodin # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License along # # with this program; if not, write to the Free Software Foundation, Inc., # # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # ############################################################################# TEMPLATE = subdirs SUBDIRS = stardict web qstardict-0.12.9.orig/plugins/plugin.pri0000644000175000017500000000311511023552133016672 0ustar alexalex############################################################################# # plugin.pri - QStarDict, a StarDict clone written with using Qt # # Copyright (C) 2008 Alexander Rodin # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License along # # with this program; if not, write to the Free Software Foundation, Inc., # # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # ############################################################################# isEmpty(TARGET):error(You must set TARGET before including $$_FILE_) TEMPLATE = lib include(../qstardict.pri) CONFIG += plugin INCLUDEPATH += $$dirname(PWD) target.path = $$PLUGINS_DIR INSTALLS += target qstardict-0.12.9.orig/INSTALL0000644000175000017500000000047011023552142014231 0ustar alexalexYou need Qt >= 4.2 and glib >= 2.0. If you have QtDBus module QStarDict will be compiled with D-Bus support. To disable D-Bus support add NO_DBUS=1 to qmake arguments. To disable translations add NO_TRANSLATIONS=1 to qmake arguments. To build and install: 1) qmake [switches] 2) make 3) make install qstardict-0.12.9.orig/README0000644000175000017500000000053011023552142014055 0ustar alexalexQStarDict is a StarDict clone written with using Qt4. The user interface is similar to StarDict. Main features * Full support of StarDict dictionaries * Working in system tray * Scanning mouse selection and showing popup window with translation of selected word * Translations reformatting * Pronouncing translated word * Support for plugins qstardict-0.12.9.orig/qstardict/0000755000175000017500000000000011023552371015201 5ustar alexalexqstardict-0.12.9.orig/qstardict/resizablepopup.cpp0000644000175000017500000002114311023552142020746 0ustar alexalex/***************************************************************************** * resizablepopup.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "resizablepopup.h" #include #include #include #include #include namespace { const int CornerSize = 10; } namespace QStarDict { ResizablePopup::ResizablePopup(QWidget *parent) : QFrame(parent, Qt::Popup) { m_isMoving = false; m_resizeDirection = None; m_timeoutBeforeHide = 0; m_timerCloseId = 0; m_timerResizeId = 0; m_isPopuped = false; setMouseTracking(true); setLineWidth(1); setMidLineWidth(2); setFrameStyle(QFrame::Box); setFrameShadow(QFrame::Raised); } void ResizablePopup::popup() { if (m_defaultSize != size()) resize(m_defaultSize); QPoint newPosition = QCursor::pos() - QPoint(30, 30); if (newPosition.x() < 0) newPosition.setX(0); else if (newPosition.x() + width() > QApplication::desktop()->width()) newPosition.setX(QApplication::desktop()->width() - width()); if (newPosition.y() < 0) newPosition.setY(0); else if (newPosition.y() + height() > QApplication::desktop()->height()) newPosition.setY(QApplication::desktop()->height() - height()); move(newPosition); show(); m_isPopuped = true; } void ResizablePopup::enterEvent(QEvent*) { if (m_timerCloseId) { killTimer(m_timerCloseId); m_timerCloseId = 0; } } void ResizablePopup::leaveEvent(QEvent*) { if (geometry().contains(QCursor::pos())) return; if (m_resizeDirection) return; if (m_timeoutBeforeHide < 0) return; if (m_timeoutBeforeHide == 0) { m_isPopuped = false; hide(); } else if (! m_timerCloseId) m_timerCloseId = startTimer(m_timeoutBeforeHide); } void ResizablePopup::mouseMoveEvent(QMouseEvent *event) { Qt::CursorShape cursorShape = Qt::ArrowCursor; if ((event->x() >= 0 && event->x() < CornerSize && event->y() >= 0 && event->y() < CornerSize) || (event->x() < width() && event->x() >= width() - CornerSize && event->y() < height() && event->y() >= height() - CornerSize)) cursorShape = Qt::SizeFDiagCursor; else if ((event->x() < width() && event->x() >= width() - CornerSize && event->y() >= 0 && event->y() < CornerSize) || (event->x() >= 0 && event->x() < CornerSize && event->y() < height() && event->y() >= height() - CornerSize)) cursorShape = Qt::SizeBDiagCursor; else if (event->x() >= 0 && event->x() < frameWidth() || event->x() < width() && event->x() >= width() - frameWidth()) cursorShape = Qt::SizeHorCursor; else if (event->y() >= 0 && event->y() < frameWidth() || event->y() < height() && event->y() >= height() - frameWidth()) cursorShape = Qt::SizeVerCursor; if (cursor().shape() != cursorShape) setCursor(cursorShape); else if (event->buttons().testFlag(Qt::LeftButton)) { if (m_isMoving) move(pos() + (event->globalPos() - m_oldCursorPos)); m_oldCursorPos = event->globalPos(); return; } m_isMoving = false; } void ResizablePopup::mousePressEvent(QMouseEvent *event) { if (! geometry().contains(event->globalPos())) { if (m_timerCloseId) { killTimer(m_timerCloseId); m_timerCloseId = 0; } m_isPopuped = false; hide(); return; } if (event->buttons().testFlag(Qt::LeftButton)) { if (event->x() < CornerSize && event->y() < CornerSize) m_resizeDirection = TopLeft; else if (event->x() >= width() - CornerSize && event->y() < CornerSize) m_resizeDirection = TopRight; else if (event->x() < CornerSize && event->y() >= height() - CornerSize) m_resizeDirection = BottomLeft; else if (event->x() >= width() - CornerSize && event->y() >= height() - CornerSize) m_resizeDirection = BottomRight; else if (event->x() < frameWidth()) m_resizeDirection = Left; else if (event->x() >= width() - frameWidth()) m_resizeDirection = Right; else if (event->y() < frameWidth()) m_resizeDirection = Top; else if (event->y() >= height() - frameWidth()) m_resizeDirection = Bottom; else m_resizeDirection = None; if (m_resizeDirection) m_timerResizeId = startTimer(8); } m_isMoving = true; m_oldCursorPos = event->globalPos(); } void ResizablePopup::mouseReleaseEvent(QMouseEvent*) { stopResize(); } void ResizablePopup::mouseDoubleClickEvent(QMouseEvent*) { m_isPopuped = false; if (m_timerCloseId) { killTimer(m_timerCloseId); m_timerCloseId = 0; } hide(); } void ResizablePopup::timerEvent(QTimerEvent *event) { if (event->timerId() == m_timerResizeId) { doResize(); } else if (event->timerId() == m_timerCloseId) { m_isPopuped = false; hide(); killTimer(m_timerCloseId); m_timerCloseId = 0; stopResize(); } } void ResizablePopup::doResize() { if (! QApplication::mouseButtons().testFlag(Qt::LeftButton)) stopResize(); if (m_resizeDirection) { QRect newGeometry = geometry(); switch (m_resizeDirection) { case TopLeft: newGeometry.setTopLeft(QCursor::pos()); break; case TopRight: newGeometry.setTopRight(QCursor::pos()); break; case BottomLeft: newGeometry.setBottomLeft(QCursor::pos()); break; case BottomRight: newGeometry.setBottomRight(QCursor::pos()); break; case Left: newGeometry.setLeft(QCursor::pos().x()); break; case Right: newGeometry.setRight(QCursor::pos().x()); break; case Top: newGeometry.setTop(QCursor::pos().y()); break; case Bottom: newGeometry.setBottom(QCursor::pos().y()); break; default: ; // Nothing } if (newGeometry.width() < minimumSize().width()) { newGeometry.setWidth(width()); newGeometry.moveLeft(geometry().left()); } if (newGeometry.height() < minimumSize().height()) { newGeometry.setHeight(height()); newGeometry.moveTop(geometry().top()); } if (newGeometry != geometry()) setGeometry(newGeometry); } } void ResizablePopup::stopResize() { if (m_resizeDirection) { m_resizeDirection = None; killTimer(m_timerResizeId); m_timerResizeId = 0; } } bool ResizablePopup::event(QEvent *event) { if (event->type() == QEvent::WindowUnblocked && m_isPopuped) { if (m_timerCloseId) { killTimer(m_timerCloseId); m_timerCloseId = 0; } show(); return true; } else return QFrame::event(event); } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-0.12.9.orig/qstardict/cssedit.cpp0000644000175000017500000003171611023552142017347 0ustar alexalex/***************************************************************************** * cssedit.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "cssedit.h" #include #include namespace QStarDict { CSSEdit::CSSEdit(QWidget *parent) : QWidget(parent) { setupUi(this); connect(m_elementCombo, SIGNAL(currentIndexChanged(int)), SLOT(setCurrentElement(int))); connect(m_fontCombo, SIGNAL(currentFontChanged(const QFont&)), SLOT(propertyChanged())); connect(m_sizeSpin, SIGNAL(valueChanged(int)), SLOT(propertyChanged())); connect(m_boldButton, SIGNAL(toggled(bool)), SLOT(propertyChanged())); connect(m_italicButton, SIGNAL(toggled(bool)), SLOT(propertyChanged())); connect(m_underlineButton, SIGNAL(toggled(bool)), SLOT(propertyChanged())); connect(m_colorButton, SIGNAL(clicked()), SLOT(colorSelectClicked())); connect(m_backgroundButton, SIGNAL(clicked()), SLOT(colorSelectClicked())); } void CSSEdit::setCSS(const QString &css) { m_elements.clear(); bool inBlock = false; QString element; QString currentProperty; QString currentValue; for (int i = 0; i < css.length(); ++i) { if (! inBlock) { element.clear(); for (; i < css.length() && css[i] != '{'; ++i) if (! css[i].isSpace()) element += css[i]; if (css[i] == '{') { inBlock = true; ++i; } } else { currentProperty.clear(); for (; i < css.length() && css[i] != ':'; ++i) if (! css[i].isSpace()) currentProperty += css[i]; if (! inBlock) continue; currentValue.clear(); char quote = '\0'; for (++i; i < css.length() && css[i] != ';'; ++i) { if (quote) { if (css[i] == quote) { while (i < css.length() && css[i] != ';') ++i; break; } else currentValue += css[i]; } else if (! css[i].isSpace()) { if (css[i] == '\'' || css[i] == '\"') quote = css[i].toAscii(); else currentValue += css[i]; } } m_elements[element][currentProperty] = currentValue; while (css[i + 1].isSpace()) ++i; if (css[i + 1] == '}') { ++i; inBlock = false; } } } updateElementCombo(); updatePreview(); } void CSSEdit::setElementsAliases(const QHash &aliases) { m_elementsAliases = aliases; updateElementCombo(); updatePreview(); } QString CSSEdit::css() const { QString result; for (QHash::const_iterator i = m_elements.begin(); i != m_elements.end(); ++i) { result += i.key() + "\n{\n"; for (Element::const_iterator j = i->begin(); j != i->end(); ++j) { result += j.key() + ": "; if (j->contains(' ')) result += "\"" + *j + "\";\n"; else result += *j + ";\n"; } result += "}\n"; } return result; } void CSSEdit::setCurrentElement(int index) { if (! m_elements.contains(m_elementCombo->itemData(index).toString())) return; m_currentElement = m_elementCombo->itemData(index).toString(); Element *element = &m_elements[m_currentElement]; Element parentElement = getParentElement(m_currentElement); QColor color(element->contains("color") ? element->value("color") : parentElement["color"]); m_colorButton->setText(color.name()); QPalette palette = m_colorButton->palette(); palette.setColor(QPalette::Normal, QPalette::ButtonText, color); m_colorButton->setPalette(palette); color = QColor(element->contains("background-color") ? element->value("background-color") : parentElement["background-color"]); m_backgroundButton->setText(color.name()); palette = m_backgroundButton->palette(); palette.setColor(QPalette::Normal, QPalette::ButtonText, color); m_backgroundButton->setPalette(palette); m_fontCombo->setCurrentFont(element->contains("font-family") ? element->value("font-family") : parentElement["font-family"]); QString value = element->contains("font-size") ? element->value("font-size") : parentElement["font-size"]; if (! value.endsWith("pt")) value = parentElement["font-size"]; m_sizeSpin->setValue(value.left(value.length() - 2).toInt()); value = element->contains("font-weight") ? element->value("font-weight") : parentElement["font-weight"]; m_boldButton->setChecked(value == "bold"); value = element->contains("font-style") ? element->value("font-style") : parentElement["font-style"]; m_italicButton->setChecked(value == "italic"); value = element->contains("text-decoration") ? element->value("text-decoration") : parentElement["text-decoration"]; m_underlineButton->setChecked(value == "underline"); updatePreview(); } void CSSEdit::propertyChanged() { if (! sender()) return; if (! m_elements.contains(m_currentElement)) return; Element *element = &m_elements[m_currentElement]; Element parentElement = getParentElement(m_currentElement); if (sender() == m_fontCombo) { QString font = m_fontCombo->currentText(); if (parentElement["font-family"] == font) element->remove("font-family"); else element->insert("font-family", font); } else if (sender() == m_sizeSpin) { QString size = QString::number(m_sizeSpin->value()) + "pt"; if (parentElement["font-size"] == size) element->remove("font-size"); else element->insert("font-size", size); } else if (sender() == m_boldButton) { QString weight = (m_boldButton->isChecked() ? "bold" : "normal"); if (parentElement["font-weight"] == weight) element->remove("font-weight"); else element->insert("font-weight", weight); } else if(sender() == m_italicButton) { QString style = (m_italicButton->isChecked() ? "italic" : "normal"); if (parentElement["font-style"] == style) element->remove("font-style"); else element->insert("font-style", style); } else if(sender() == m_underlineButton) { QString decoration = (m_underlineButton->isChecked() ? "underline" : "none"); if (parentElement["text-decoration"] == decoration) element->remove("text-decoration"); else element->insert("text-decoration", decoration); } updatePreview(); } void CSSEdit::colorSelectClicked() { QToolButton *colorButton; QString propertyName; if (sender() == m_colorButton) { colorButton = m_colorButton; propertyName = "color"; } else if (sender() == m_backgroundButton) { colorButton = m_backgroundButton; propertyName = "background-color"; } else return; if (! m_elements.contains(m_currentElement)) return; Element *element = &m_elements[m_currentElement]; Element parentElement = getParentElement(m_currentElement); QColor color = QColorDialog::getColor(QColor(colorButton->text()), this); if (color.isValid()) { colorButton->setText(color.name()); QPalette palette = colorButton->palette(); palette.setColor(QPalette::Normal, QPalette::ButtonText, color); colorButton->setPalette(palette); if (parentElement[propertyName] == color.name()) element->remove(propertyName); else element->insert(propertyName, color.name()); updatePreview(); } } void CSSEdit::updatePreview() { QString html = ""; html += ""; for (QHash::const_iterator i = m_elements.begin(); i != m_elements.end(); ++i) { QString alias; if (m_elementsAliases.contains(i.key())) alias = m_elementsAliases.value(i.key()); else alias = i.key(); int pos = i.key().indexOf('.'); if (pos == -1) html += "<" + i.key() + ">" + alias + "
    "; else { QString parent = i.key().left(pos); QString class_ = i.key().mid(pos + 1); html += "<" + parent + " class=\'" + class_ + "\'>" + alias + "
    "; } } html += ""; m_preview->setHtml(html); } void CSSEdit::updateElementCombo() { m_elementCombo->clear(); for (QHash::const_iterator i = m_elements.begin(); i != m_elements.end(); ++i) { QString alias; if (m_elementsAliases.contains(i.key())) alias = m_elementsAliases.value(i.key()); else alias = i.key(); m_elementCombo->addItem(alias, i.key()); } if (m_elements.begin() != m_elements.end()) m_currentElement = m_elements.begin().key(); else m_currentElement.clear(); } CSSEdit::Element CSSEdit::getParentElement(const QString &elementName) { Element body = m_elements.value("body"); if (elementName == "body") { body["color"] = QApplication::palette().color(QPalette::Normal, QPalette::Text).name(); body["background-color"] = QApplication::palette().color(QPalette::Normal, QPalette::Base).name(); body["font-family"] = QApplication::font().family(); body["font-size"] = QString::number(QApplication::font().pointSize()) + "pt"; body["font-weight"] = (QApplication::font().weight() == QFont::Bold) ? "bold" : "normal"; body["font-style"] = (QApplication::font().style() == QFont::StyleItalic) ? "italic" : "normal"; body["text-decoration"] = QApplication::font().underline() ? "underline" : "none"; return body; } else { if (! body.contains("color")) body["color"] = QApplication::palette().color(QPalette::Normal, QPalette::Text).name(); if (! body.contains("background-color")) body["background-color"] = QApplication::palette().color(QPalette::Normal, QPalette::Base).name(); if (! body.contains("font-family")) body["font-family"] = QApplication::font().family(); if (! body.contains("font-size")) body["font-size"] = QString::number(QApplication::font().pointSize()) + "pt"; if (! body.contains("font-weight")) body["font-weight"] = (QApplication::font().weight() == QFont::Bold) ? "bold" : "normal"; if (! body.contains("font-style")) body["font-style"] = (QApplication::font().style() == QFont::StyleItalic) ? "italic" : "normal"; if (! body.contains("text-decoration")) body["text-decoration"] = QApplication::font().underline() ? "underline" : "none"; } QString parentName; int pos = elementName.indexOf('.'); if (pos != -1) { parentName = elementName.left(pos); if (m_elements.contains(parentName)) { Element parent = m_elements[parentName]; for (Element::const_iterator i = body.begin(); i != body.end(); ++i) if (! parent.contains(i.key())) parent[i.key()] = *i; return parent; } else return body; } return body; } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-0.12.9.orig/qstardict/cssedit.ui0000644000175000017500000001136611023552142017201 0ustar alexalex QStarDict::CSSEdit 0 0 100 30 Preview true Element Foreground Background Select element Click to select color #000000 Click to select color #000000 Font Size Select font Select font size pt 4 150 2 10 75 true Bold B true 50 true false Italic I true 50 false true Underline U true m_elementCombo m_colorButton m_fontCombo m_sizeSpin m_boldButton m_italicButton m_underlineButton qstardict-0.12.9.orig/qstardict/popupwindow.h0000644000175000017500000001050311023552142017740 0ustar alexalex/***************************************************************************** * popupwindow.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef POPUPWINDOW_H #define POPUPWINDOW_H #include "resizablepopup.h" #include "dictcore.h" #include "dictwidget.h" namespace QStarDict { class DictWidget; class Selection; /** * The PopupWindow is a window that scan selection and pop-up * when needed. */ class PopupWindow: public ResizablePopup { Q_OBJECT public: /** * Construct new PopupWindow. */ PopupWindow(QWidget *parent = 0); /** * Destructor. */ ~PopupWindow(); /** * Return true if scanning enabled, otherwise return false. */ bool isScan() const; /** * Return modifier key. The modifiers are from * Qt::KeyboardModifier enum. */ int modifierKey() const { return m_modifierKey; } /** * Set behaviour for not found in dictionary words. */ bool showIfNotFound() const { return m_showIfNotFound; } /** * Set the dictionary. */ void setDict(DictCore *dict); /** * Returns the dictionary. */ DictCore* dict() const { return m_dict; } /** * Return true if shown words will be pronounced, othewise * return false. */ bool pronounceWord() const { return m_pronounceWord; } void setDefaultStyleSheet(const QString &css) { translationView->setDefaultStyleSheet(css); } QString defaultStyleSheet() const { return translationView->defaultStyleSheet(); } public slots: /** * Enable or disable scanning of selection. */ void setScan(bool scan); /** * Set modifier key. If key not is 0 then popup will be shown * only if key is pressed. */ void setModifierKey(int key) { m_modifierKey = key; } /** * Set beahivour for words that not in dictionaris. * If true then popup will be shown with text "No found", otherwise * popup will not be shown. */ void setShowIfNotFound(bool mode) { m_showIfNotFound = mode; } /** * Popup with translation of text. */ void showTranslation(const QString &text); /** * If prounounceWord is true shown words will be prounounced. */ void setPronounceWord(bool pronounceWord) { m_pronounceWord = pronounceWord; } private slots: void selectionChanged(const QString &text); signals: void scanChanged(bool scan); private: void loadSettings(); void saveSettings(); DictWidget *translationView; DictCore* m_dict; int m_modifierKey; bool m_showIfNotFound; Selection *m_selection; bool m_pronounceWord; }; } #endif // POPUPWINDOW_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-0.12.9.orig/qstardict/qstardict.pro0000644000175000017500000000535111023552142017721 0ustar alexalex############################################################################# # qstardict.pro - QStarDict, a StarDict clone written with using Qt # # Copyright (C) 2008 Alexander Rodin # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License along # # with this program; if not, write to the Free Software Foundation, Inc., # # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # ############################################################################# TEMPLATE = app TARGET = qstardict include(../qstardict.pri) FORMS += \ cssedit.ui \ mainwindow.ui \ settingsdialog.ui HEADERS += \ application.h \ cssedit.h \ dictbrowser.h \ dictcore.h \ dictplugin.h \ dictwidget.h \ keyboard.h \ mainwindow.h \ popupwindow.h \ resizablepopup.h \ selection.h \ settingsdialog.h \ speaker.h \ trayicon.h unix:isEmpty(NO_DBUS):HEADERS += \ dbusadaptor.h SOURCES += \ application.cpp \ cssedit.cpp \ dictbrowser.cpp \ dictcore.cpp \ dictwidget.cpp \ keyboard.cpp \ main.cpp \ mainwindow.cpp \ popupwindow.cpp \ resizablepopup.cpp \ selection.cpp \ settingsdialog.cpp \ speaker.cpp \ trayicon.cpp unix:isEmpty(NO_DBUS):SOURCES += \ dbusadaptor.cpp RESOURCES += \ pixmaps/pixmaps.qrc win32:RC_FILE += \ qstardict.rc DISTFILES += \ qstardict.png \ qstardict.desktop isEmpty(NO_TRANSLATIONS):include("translations/translations.pri") target.path = $$BIN_DIR INSTALLS += target unix { desktop_icon.files = qstardict.png desktop_icon.path = $$INSTALL_PREFIX/share/pixmaps desktop_file.files = qstardict.desktop desktop_file.path = $$INSTALL_PREFIX/share/applications INSTALLS += desktop_icon desktop_file } qstardict-0.12.9.orig/qstardict/selection.h0000644000175000017500000000444011023552142017335 0ustar alexalex/***************************************************************************** * selection.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef SELECTION_H #define SELECTION_H #include class QTimerEvent; namespace QStarDict { /** * Mouse selection representation class. */ class Selection: public QObject { Q_OBJECT public: /** * Constructor. */ Selection(QObject *parent = 0); /** * Return scan state. */ bool isScan() const { return m_scan; } public slots: /** * Set scan mode. */ void setScan(bool scan); signals: /** * Emits when selection text is changed. */ void changed(const QString &newText); protected: void timerEvent(QTimerEvent*); private: QString m_lastState; int m_scan; int m_timerId; }; } #endif // SELECTION_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-0.12.9.orig/qstardict/mainwindow.h0000644000175000017500000000722311023552142017526 0ustar alexalex/***************************************************************************** * mainwindow.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include "ui_mainwindow.h" class QMenu; class QCloseEvent; namespace QStarDict { class DictCore; class SettingsDialog; /** * The main window of QStarDict. */ class MainWindow: public QMainWindow, private Ui::MainWindow { Q_OBJECT public: /** * Create new MainWindow. */ MainWindow(QWidget *parent = 0); /** * Destructor. */ ~MainWindow(); /** * Return true if instant search is on, otherwise false. */ bool isInstantSearch() const { return m_instantSearch; } /** * Set instant search mode. If instantSearch is true * translation will be shown when typing, otherwise only when * "Search" button clicked. */ void setInstantSearch(bool instantSearch); /** * Set the dictionary. */ void setDict(DictCore *dict); /** * Return the dictionary. */ DictCore *dict() const { return m_dict; } /** * Set default style sheet for translations. */ void setDefaultStyleSheet(const QString &css) { translationView->setDefaultStyleSheet(css); } /** * Return default style sheet. */ QString defaultStyleSheet() const { return translationView->defaultStyleSheet(); } void reload(); public slots: /** * Show translation of word. */ void showTranslation(const QString &word); protected: void timerEvent(QTimerEvent *event); void keyPressEvent(QKeyEvent *event); private slots: void on_actionAbout_triggered(); void on_actionSettings_triggered(); void on_queryButton_clicked(); void wordsListItemActivated(QListWidgetItem *item); void wordTranslated(const QString &word); void queryEdited(const QString &); private: void createConnections(); void loadSettings(); void saveSettings(); DictCore *m_dict; bool m_instantSearch; int m_queryTimer; }; } #endif // MAINWINDOW_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-0.12.9.orig/qstardict/settingsdialog.ui0000644000175000017500000005513411023552142020564 0ustar alexalex QStarDict::SettingsDialog 0 0 463 498 QStarDict Settings Show information about dictionary 9 9 9 9 6 6 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok false 0 Global settings Instant search 6 0 0 0 0 Pronounce words using this command: Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Qt::Vertical 369 171 Dictionaries Dictionaries QAbstractItemView::NoEditTriggers QAbstractItemView::SingleSelection QAbstractItemView::SelectRows false Move up Up :/icons/arrow-up.png Move down Down :/icons/arrow-down.png Show info :/icons/dialog-information.png Qt::Horizontal 40 20 16777215 196 Plugins Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft QAbstractItemView::NoEditTriggers QAbstractItemView::SingleSelection QAbstractItemView::SelectRows false Show information about plugin Info :/icons/dialog-information.png Configure plugin Configure :/icons/configure.png Qt::Horizontal 40 20 Popup window 9 9 9 9 6 6 Behavior 9 9 9 9 6 6 6 0 0 0 0 Pronounce the word 6 0 0 0 0 Timeout before hide after mouse over Don't hide sec 1 0.000000000000000 10.000000000000000 0.100000000000000 0.500000000000000 6 0 0 0 0 true Show only if modifier pressed false Alt Control Shift Win Scan selection true Show if word not found Apperance 9 9 9 9 6 6 6 0 0 0 0 Opacity % 1 100 100 6 0 0 0 0 Default width 96 9999 320 6 0 0 0 0 Default height 96 9999 240 Qt::Vertical 20 101 Apperance QStarDict::CSSEdit QWidget

    cssedit.h
    1 instantSearchBox speechCmdEdit buttonBox tabWidget dictsTableView dictsMoveUpButton dictsMoveDownButton dictsShowInfoButton pluginsTableView pluginsShowInfoButton pluginsConfigureButton useScanBox showIfNotFoundBox useScanModifierBox modifierKeyBox timeoutBeforeHideSpin pronounceWordBox popupDefaultWidthSpin popupDefaultHeightSpin popupOpacitySpin buttonBox accepted() QStarDict::SettingsDialog accept() 330 587 410 299 buttonBox rejected() QStarDict::SettingsDialog reject() 406 587 410 299 useScanModifierBox toggled(bool) modifierKeyBox setEnabled(bool) 165 140 273 137 qstardict-0.12.9.orig/qstardict/mainwindow.ui0000644000175000017500000001604311023552142017714 0ustar alexalex QStarDict::MainWindow 0 0 742 511 QStarDict :/icons/qstardict.png 9 9 9 9 6 6 6 0 0 0 0 Clear the search box Clear :/icons/clear-right.png Qt::ToolButtonIconOnly Fuzzy query Search :/icons/search-filter.png Qt::ToolButtonTextBesideIcon QDockWidget::AllDockWidgetFeatures Qt::NoDockWidgetArea Words list 1 9 9 9 9 6 6 0 0 742 28 &File &Help &Settings :/icons/application-exit.png &Quit Ctrl+Q &About About &Qt :/icons/configure.png &Configure QStarDict true &Scan DictWidget QWidget
    dictwidget.h
    searchBox queryButton wordsList searchClearButton searchClearButton clicked() searchBox clear() 315 59 647 61 searchClearButton clicked() searchBox setFocus() 315 59 647 61 searchBox returnPressed() queryButton click() 438 50 661 51
    qstardict-0.12.9.orig/qstardict/dictcore.h0000644000175000017500000001242611023552142017147 0ustar alexalex/***************************************************************************** * dictcore.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef DICTCORE_H #define DICTCORE_H #include #include #include #include #include #include "dictplugin.h" namespace QStarDict { /** * The DictCore is a base dictionary class. */ class DictCore: public QObject { Q_OBJECT public: /** * This class represents a dictionary. */ class Dictionary { public: Dictionary(const QString &plugin, const QString &name) : m_plugin(plugin), m_name(name) { } Dictionary() { } const QString &plugin() const { return m_plugin; } const QString &name() const { return m_name; } void setPlugin(const QString &plugin) { m_plugin = plugin; } void setName(const QString &name) { m_name = name; } bool operator == (const Dictionary &dict) { return m_name == dict.m_name && m_plugin == dict.m_plugin; } private: QString m_plugin; QString m_name; }; /** * Construct dictionary. */ DictCore(QObject *parent = 0); /** * Destructor. */ ~DictCore(); /** * Returns true if word is exists in dictionaries, * otherwise false. */ bool isTranslatable(const QString &word); /** * Returns translation for word. If word not found, returns * "Not found!" */ QString translate(const QString &word); /** * Returns a list of similar words contained in dictionaries. */ QStringList findSimilarWords(const QString &word); /** * Returns a list of available dictionary plugins. */ QStringList availablePlugins() const; /** * Returns a list of loaded dictionary plugins. */ QStringList loadedPlugins() const { return QStringList(m_plugins.keys()); } /** * Sets a loaded plugins. * If plugin cannot be loaded it will not be added to * loadedPlugins list. */ void setLoadedPlugins(const QStringList &loadedPlugins); /** * Returns a list of available dictionaries. * The first item in pair is a plugin name, the second item * in pair is a dictionary name. */ QList availableDicts() const; /** * Returns a list of loaded dictionaries. * The first item in pair is a plugin name, the second item * in pair is a dictionary name. */ const QList &loadedDicts() const { return m_loadedDicts; } /** * Sets a loaded dictionaries. * The first item in pair is a plugin name, the second item * in pair is a dictionary name. * If dictionary cannot be loaded it will not be added to * availableDicts list. */ void setLoadedDicts(const QList &loadedDicts); /** * Reload loaded dicts. */ void reloadDicts(); /** * Returns pointer to plugin instance or 0 if not loaded. */ DictPlugin *plugin(const QString &plugin) { return m_plugins.contains(plugin) ? qobject_cast(m_plugins[plugin]->instance()) : 0; } private: /** * Save settings. */ void saveSettings(); /** * Load settings. */ void loadSettings(); QHash m_plugins; QList m_loadedDicts; }; } #endif // DICTCORE_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-0.12.9.orig/qstardict/trayicon.h0000644000175000017500000000354111023552142017201 0ustar alexalex/***************************************************************************** * trayicon.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef TRAYICON_H #define TRAYICON_H #include namespace QStarDict { class TrayIcon: public QSystemTrayIcon { Q_OBJECT public: TrayIcon(QObject *parent = 0); private slots: void on_activated(QSystemTrayIcon::ActivationReason reason); void on_actionSettings_triggered(); void setScanEnabled(bool enabled); }; } #endif // TRAYICON_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent qstardict-0.12.9.orig/qstardict/translations/0000755000175000017500000000000011023552371017722 5ustar alexalexqstardict-0.12.9.orig/qstardict/translations/translations.pri0000644000175000017500000000453311023552141023157 0ustar alexalex############################################################################# # translations.pri - QStarDict, a StarDict clone written with using Qt # # Copyright (C) 2008 Alexander Rodin # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License along # # with this program; if not, write to the Free Software Foundation, Inc., # # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # ############################################################################# TRANSLATIONS += \ translations/qstardict-bg_BG.ts \ translations/qstardict-cs_CZ.ts \ translations/qstardict-de_DE.ts \ translations/qstardict-it_IT.ts \ translations/qstardict-pl_PL.ts \ translations/qstardict-pt_BR.ts \ translations/qstardict-ru_RU.ts \ translations/qstardict-ua_UA.ts \ translations/qstardict-zh_CN.ts \ translations/qstardict-zh_TW.ts COMPILED_TRANSLATIONS += \ translations/qstardict-bg_BG.qm \ translations/qstardict-cs_CZ.qm \ translations/qstardict-de_DE.qm \ translations/qstardict-it_IT.qm \ translations/qstardict-pl_PL.qm \ translations/qstardict-pt_BR.qm \ translations/qstardict-ru_RU.qm \ translations/qstardict-ua_UA.qm \ translations/qstardict-zh_CN.qm \ translations/qstardict-zh_TW.qm DISTFILES += $$COMPILED_TRANSLATIONS isEmpty(NO_TRANSLATIONS) { translations.files = $$COMPILED_TRANSLATIONS translations.path = $$TRANSLATIONS_DIR INSTALLS += translations } qstardict-0.12.9.orig/qstardict/translations/qstardict-zh_CN.ts0000644000175000017500000005133211023552141023266 0ustar alexalex QStarDict::CSSEdit Preview 预览 Element Foreground 前景 Background 背景 Select element 选择元素 Click to select color 点击以选择 #000000 #000000 Font 字体 Size 大小 Select font 选择字体 Select font size 选择字体大小 pt pt Bold 黑体 B B Italic 斜体 I I Underline 下划线 U U QStarDict::DictBrowser The word <b>%1</b> is not found. 找不到单词 <b>%1</b> QStarDict::DictWidget Save translation 保存翻译 HTML files (*.html, *.htm) HTML文件(*.html, *.htm) Text files (*.txt) 文本文件 Error 错误 Cannot save translation as %1 不能将翻译保存为 %1 Go to &previous translation 前往前一翻译 (&p) Go to &next translation 前往后一翻译 (&n) &Save to file 保存到文件(&S) Speak &word 读出单词 (&w) Prin&t translation ��ӡ����(t) QStarDict::MainWindow About QStarDict 关于 QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> Copyright (C) 2007 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> 版权 (C) 2007 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict QStarDict %1 - QStarDict %1 - QStarDict Clear the search box 清除搜索框 Clear 清除 Fuzzy query 模糊查询 Search 搜索 Words list 词汇列表 &File 文件(&F) &Help 帮助(&H) &Settings &设置 &Quit 离开(&Q) Ctrl+Q Ctrl+Q &About 关于(&A) About &Qt 关于 Qt &Configure QStarDict 设置 QStarDict(&C) &Scan 取词(&S) QStarDict::SettingsDialog Enabled 启用 Name 名称 Plugin 插件 Information about dictionary "%1" 字典"%1" 的信息 <b>Name:</b> %1<br> <b>Plugin:</b> %1<br> <b>插件:</b> %1<br> unknown 未知 <b>Description:</b> %1 <b>描述:</b> %1 Information about %1 plugin 关于插件 %1 的信息 <b>Version:</b> %1<br> <b>版本:</b> %1<br> <b>Authors:</b> %1<br> <b>作者:</b> %1<br> <br> <b>Can search similar words:</b> %1<br> <b>可以搜索相似单词:</b> %1<br> yes no QStarDict Settings QStarDict 设置 Show information about dictionary 显示字典信息 Global settings 全局设置 Instant search 即搜 Pronounce words using this command: 使用如下命令发音 Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Dictionaries 字典 Move up 上移 Up Move down 下移 Down Show info 显示信息 Plugins 插件 Show information about plugin 显示插件信息 Info 信息 Configure plugin 设定插件 Configure 设定 Popup window 弹出窗口 Behavior 行为 Pronounce the word 单词发音 Timeout before hide after mouse over 鼠标悬停隐藏超时 Don't hide 不隐藏 sec Show only if modifier pressed 显示,仅当按下 Alt Alt Control Control Shift Shift Win Win Scan selection 选择区取词 Show if word not found 当未找到词时显示 Apperance 外观 Opacity 不透明度 % % Default width 默认宽度 Default height 默认高度 <b>Author:</b> %1<br> <b>Words count:</b> %1<br> All translation 所有的翻译 Dictionary name 字典名称 Title 标题 Explanation Abbreviation 缩写 Example 例子 Transcription QStarDict::TrayIcon QStarDict QStarDict &Scan 取词(&S) &Configure QStarDict 设置 QStarDict(&C) &Quit 离开(&Q) QStarDict: scanning is %1 enabled disabled qstardict-0.12.9.orig/qstardict/translations/qstardict-pl_PL.ts0000644000175000017500000005244511023552141023301 0ustar alexalex QStarDict::CSSEdit Preview Podgląd Element Element Foreground Pierwszy plan Background Tło Select element Wybierz element Click to select color Kliknij by wybrać kolor #000000 Font Czcionka Size Rozmiar Select font Wybierz czcionkę Select font size Wybierz rozmiar czionki pt Bold Pogrubiona B Italic Pochyła I Underline Podkreślona U QStarDict::DictBrowser The word <b>%1</b> is not found. Słowo <b>%1</b> nie zostało znalezione. QStarDict::DictWidget Save translation Zapisz tłumaczenie HTML files (*.html, *.htm) Pliki HTML (*.html, *.htm) Text files (*.txt) Pliki tekstowe (*.txt) Error Błąd Cannot save translation as %1 Nie mogę zapisać tłumaczenia jako %1 Go to &previous translation Idź do &poprzedniego tłumaczenia Go to &next translation Idź do &następnego tłumaczenia &Save to file &Zapisz do pliku Speak &word Wymów sło&wo Prin&t translation Drukuj &tłumaczenie QStarDict::MainWindow About QStarDict O QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> <b>QStarDict %1 </b> - StarDict wersja QT<br> Copyright (C) 2007 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> Copyright (C) 2007 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict QStarDict %1 - QStarDict %1 - QStarDict Clear the search box Wyczyść okienko wyszukiwania Clear Wyczyść Fuzzy query Mętne zapytanie Search Szukaj Words list Lista słów &File &Plik &Help &Pomoc &Settings &Ustawienia &Quit &Zamknij Ctrl+Q Ctrl+Q &About &O QStarDict About &Qt O &Qt &Configure QStarDict &Konfiguruj QStarDict &Scan &Skanuj QStarDict::SettingsDialog Enabled Włączone Name Imię Plugin Wtyczka Information about dictionary "%1" Informacja o słowniku "%1" <b>Name:</b> %1<br> <b>Imię:</b> %1<br> <b>Plugin:</b> %1<br> <b>Wtyczka:</b> %1<br> unknown nieznany <b>Description:</b> %1 <b>Opis:</b> %1 Information about %1 plugin Informację o wtyczce %1 <b>Version:</b> %1<br> <b>Wersja:</b> %1<br> <b>Authors:</b> %1<br> <b>Autorzy:</b> %1<br> <br> <br> <b>Can search similar words:</b> %1<br> <b>Może wyszukać podobne słowa:</b> %1<br> yes tak no nie QStarDict Settings Ustawienia QStarDict Show information about dictionary Pokaż informacje o słowniku Global settings Globalne opcje Instant search Błyskawiczne szukanie Pronounce words using this command: Wymów słowo używając tego polecenia: Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Dictionaries Słowniki Move up Przesuń w górę Up Góra Move down Przesuń w dół Down Dół Show info Pokaż info Plugins Wtyczki Show information about plugin Pokaż informacje o wtyczce Info Info Configure plugin Konfiguruj wtyczkę Configure Konfiguruj Popup window Okno popup Behavior Zachowanie Pronounce the word Wymów słowo Timeout before hide after mouse over Opóźnienie zanim ukryje po najechaniu myszką Don't hide Nie ukrywaj sec sec Show only if modifier pressed Pokaż tylko jeśli modyfikator zostanie naciśnięty Alt Alt Control Control Shift Shift Win Win Scan selection Skanuj zaznaczenie Show if word not found Pokaż jeśli słowo nie zostało znalezione Apperance Wygląd Opacity Nieprzezroczystość % % Default width Domyślna szerokość Default height Domyślna wysokość <b>Author:</b> %1<br> <b>Autor:</b> %1<br> <b>Words count:</b> %1<br> <b>Ilość słów:</b> %1<br> All translation Wszystkie tłumaczenia Dictionary name Nazwa słownika Title Tytuł Explanation Wytłumaczenie Abbreviation Skrót Example Przykład Transcription Transkrypcja QStarDict::TrayIcon QStarDict QStarDict &Scan &Skanuj &Configure QStarDict &Konfiguruj QStarDict &Quit &Zamknij QStarDict: scanning is %1 enabled disabled qstardict-0.12.9.orig/qstardict/translations/qstardict-ua_UA.ts0000644000175000017500000006026211023552141023261 0ustar alexalex QStarDict::CSSEdit Preview Попередній перегляд Element Елемент Foreground Передній план Background Задній план Select element Вибір елемента Click to select color Клік для вибору кольору #000000 Font Шрифт Size Розмір Select font Вибір шрифту Select font size Вибір розміру шрифту pt Bold Жирний B Italic Курсив I Underline Підкреслений U QStarDict::DictBrowser The word <b>%1</b> is not found. QStarDict::DictWidget Save translation Зберегти переклад HTML files (*.html, *.htm) Text files (*.txt) Error Помилка Cannot save translation as %1 Go to &previous translation Go to &next translation &Save to file &Зберегти в файл Speak &word Prin&t translation QStarDict::MainWindow About QStarDict Про програму QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> Copyright (C) 2007 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> Copyright (C) 2007 Александр Родин <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict QStarDict %1 - QStarDict Clear the search box Очистити рядок пошуку Clear Почистити Fuzzy query Нечiткий запит Search Пошук Words list Список слiв &File &Файл &Help &Довiдка &Settings &Налаштування &Quit &Вихiд Ctrl+Q Ctrl+Q &About &Про програму QStarDict About &Qt Про &бiблiотеку Qt &Configure QStarDict &Конфiгурацiя &Scan &Сканувати QStarDict::SettingsDialog Enabled Включено Name Ім'я Plugin Плагін Information about dictionary "%1" Інформація про словник "%1" <b>Name:</b> %1<br> <b>Ім'я:</b> %1<br> <b>Plugin:</b> %1<br> <b>Плагін:</b> %1<br> unknown невідомо <b>Description:</b> %1 <b>Опис:</b> %1 Information about %1 plugin Інформація про %1 плагін <b>Version:</b> %1<br> <b>Версія:</b> %1<br> <b>Authors:</b> %1<br> <b>Автори:</b> %1<br> <br> <b>Can search similar words:</b> %1<br> <b>Шукати подібні слова:</b> %1<br> yes Так no Ні QStarDict Settings Налаштування QStarDict Show information about dictionary Показати інформацію про словник Global settings Глобальні налаштування Instant search Миттєвий пошук Pronounce words using this command: Вимовляти слова, використовуючи цю команду: Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Введіть команду для розмовної програми. <br>Якщо команда містить "%s" це буде замінено словом, інaкше слово буде записано на stdin. Dictionaries Словники Move up Перейти вверх Up Уверх Move down Перейти вниз Down Вниз Show info Показати інформацію Plugins Плагіни Show information about plugin Показати інформацію про плагін Info Інфо Configure plugin Налаштувати плагін Configure Конфігурація Popup window Вiкно повiдомлення Behavior Поведiнка Pronounce the word Вимовити слово Timeout before hide after mouse over Затримка приховування пiсля "втечi" мишi з вiкна переклада Don't hide Не приховувати sec сек Show only if modifier pressed Показувати тiльки якщо натиснута клавiша-модифiкатор Alt Alt Control Control Shift Shift Win Win Scan selection Сканувати видiлення Show if word not found Показувати, якщо слово не знайдено Apperance Зовнiшнiй вигляд Opacity Непрозорiсть % % Default width Ширина за замовчуванням Default height Висота за замовчуванням <b>Author:</b> %1<br> <b>Автор:</b> %1<br> <b>Words count:</b> %1<br> <b>Кількість слів:</b> %1<br> All translation Всі переклади Dictionary name Ім'я словника Title Заголовок Explanation Проголошення Abbreviation Абревіатури Example Приклад Transcription Транскрипція QStarDict::TrayIcon QStarDict QStarDict &Scan &Сканувати &Configure QStarDict &Конфiгурацiя &Quit &Вихiд QStarDict: scanning is %1 enabled disabled qstardict-0.12.9.orig/qstardict/translations/qstardict-pl_PL.qm0000644000175000017500000002522411023552141023263 0ustar alexalexϗY~;7.cS.81 g!u =mC ]  ]E ? aQ eq   t< *( 5n :n7 T$ le   G ,< @ G  G L RV e4D e4D!> w! ! s"e w" Ge# #:4#R w# #bY$uoY$r%-0sN%V&.&mi&%%QStarDict::SettingsDialogBQStarDict::CSSEditIQStarDict::CSSEditUQStarDict::CSSEditGraUpQStarDict::SettingsDialognienoQStarDict::SettingsDialogptQStarDict::CSSEditAltAltQStarDict::SettingsDialogWinWinQStarDict::SettingsDialogtakyesQStarDict::SettingsDialog sec secQStarDict::SettingsDialog<br>
    QStarDict::SettingsDialogPogrubionaBoldQStarDict::CSSEditDBDownQStarDict::SettingsDialogCzcionkaFontQStarDict::CSSEditInfoInfoQStarDict::SettingsDialogImiNameQStarDict::SettingsDialogRozmiarSizeQStarDict::CSSEditXOpznienie zanim ukryje po najechaniu myszk$Timeout before hide after mouse overQStarDict::SettingsDialog &Plik&FileQStarDict::MainWindow &Pomoc&HelpQStarDict::MainWindow,<b>Wtyczka:</b> %1<br>Plugin: %1
    QStarDict::SettingsDialog&Zamknij&QuitQStarDict::MainWindow&Zamknij&QuitQStarDict::TrayIcon&Skanuj&ScanQStarDict::MainWindow&Skanuj&ScanQStarDict::TrayIconWyczy[ClearQStarDict::MainWindowBBdErrorQStarDict::DictWidget ShiftShiftQStarDict::SettingsDialog TytuBTitleQStarDict::SettingsDialogdisabledQStarDict::TrayIcon6Poka| informacje o sBowniku!Show information about dictionaryQStarDict::SettingsDialogHWymw sBowo u|ywajc tego polecenia:#Pronounce words using this command:QStarDict::SettingsDialogT<b>Mo|e wyszuka podobne sBowa:</b> %1<br>'Can search similar words: %1
    QStarDict::SettingsDialogbPoka| tylko je[li modyfikator zostanie naci[nityShow only if modifier pressedQStarDict::SettingsDialogWymw sBowoPronounce the wordQStarDict::SettingsDialogTBo BackgroundQStarDict::CSSEdit*BByskawiczne szukanieInstant searchQStarDict::SettingsDialog &Zapisz do pliku &Save to fileQStarDict::DictWidget&O QStarDict&AboutQStarDict::MainWindowOkno popup Popup windowQStarDict::SettingsDialogZ<b>QStarDict %1 </b> - StarDict wersja QT<br>1QStarDict %1 - Qt version of StarDict
    QStarDict::MainWindowSBowniki DictionariesQStarDict::SettingsDialog.Informacj o wtyczce %1Information about %1 pluginQStarDict::SettingsDialogNazwa sBownikaDictionary nameQStarDict::SettingsDialog(Ustawienia QStarDictQStarDict SettingsQStarDict::SettingsDialog,Pliki tekstowe (*.txt)Text files (*.txt)QStarDict::DictWidget@Idz do &poprzedniego tBumaczeniaGo to &previous translationQStarDict::DictWidget<b>Opis:</b> %1Description: %1QStarDict::SettingsDialog4Poka| informacje o wtyczceShow information about pluginQStarDict::SettingsDialog8Wyczy[ okienko wyszukiwaniaClear the search boxQStarDict::MainWindowPrzesuD w grMove upQStarDict::SettingsDialogTranskrypcja TranscriptionQStarDict::SettingsDialog Ctrl+QCtrl+QQStarDict::MainWindowKonfiguruj ConfigureQStarDict::SettingsDialogPochyBaItalicQStarDict::CSSEditWtyczkaPluginQStarDict::SettingsDialog SzukajSearchQStarDict::MainWindowCopyright (C) 2007 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a>pCopyright (C) 2007 Alexander Rodin http://qstardict.ylsoftware.comQStarDict::MainWindow(<b>Autor:</b> %1<br>Author: %1
    QStarDict::SettingsDialog2<b>Ilo[ sBw:</b> %1<br>Words count: %1
    QStarDict::SettingsDialog#000000QStarDict::CSSEdit$Nieprzezroczysto[OpacityQStarDict::SettingsDialog4Informacja o sBowniku "%1"!Information about dictionary "%1"QStarDict::SettingsDialogPoka| info Show infoQStarDict::SettingsDialog O &Qt About &QtQStarDict::MainWindow Wygld ApperanceQStarDict::SettingsDialogWtyczkiPluginsQStarDict::SettingsDialogPodgldPreviewQStarDict::CSSEditWybierz elementSelect elementQStarDict::CSSEditWytBumaczenie ExplanationQStarDict::SettingsDialog&<b>Imi:</b> %1<br>Name: %1
    QStarDict::SettingsDialog*Wszystkie tBumaczeniaAll translationQStarDict::SettingsDialog Skrt AbbreviationQStarDict::SettingsDialogHNie mog zapisa tBumaczenia jako %1Cannot save translation as %1QStarDict::DictWidgetGlobalne opcjeGlobal settingsQStarDict::SettingsDialogPPoka| je[li sBowo nie zostaBo znalezioneShow if word not foundQStarDict::SettingsDialog%1 - QStarDict%1 - QStarDictQStarDict::MainWindowQStarDict: scanning is %1QStarDict::TrayIcon Wybierz czcionk Select fontQStarDict::CSSEditNSBowo <b>%1</b> nie zostaBo znalezione. The word %1 is not found.QStarDict::DictBrowserControlControlQStarDict::SettingsDialogQStarDict QStarDictQStarDict::MainWindowQStarDict QStarDictQStarDict::TrayIconPodkre[lona UnderlineQStarDict::CSSEdit&Drukuj &tBumaczeniePrin&t translationQStarDict::DictWidgetMtne zapytanie Fuzzy queryQStarDict::MainWindow$Skanuj zaznaczenieScan selectionQStarDict::SettingsDialogLista sBw Words listQStarDict::MainWindowEnter cmd for the speaching program.
    If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process.QStarDict::SettingsDialog$Konfiguruj wtyczkConfigure pluginQStarDict::SettingsDialogZachowanieBehaviorQStarDict::SettingsDialogPierwszy plan ForegroundQStarDict::CSSEditElementElementQStarDict::CSSEditO QStarDictAbout QStarDictQStarDict::MainWindowenabledQStarDict::TrayIconWBczoneEnabledQStarDict::SettingsDialognieznanyunknownQStarDict::SettingsDialog*&Konfiguruj QStarDict&Configure QStarDictQStarDict::MainWindow*&Konfiguruj QStarDict&Configure QStarDictQStarDict::TrayIconPrzesuD w dB Move downQStarDict::SettingsDialog,<b>Autorzy:</b> %1<br>Authors: %1
    QStarDict::SettingsDialog&Ustawienia &SettingsQStarDict::MainWindow$Domy[lna szeroko[ Default widthQStarDict::SettingsDialogPrzykBadExampleQStarDict::SettingsDialog"Domy[lna wysoko[Default heightQStarDict::SettingsDialogWymw sBo&wo Speak &wordQStarDict::DictWidget4Pliki HTML (*.html, *.htm)HTML files (*.html, *.htm)QStarDict::DictWidgetNie ukrywaj Don't hideQStarDict::SettingsDialog.Kliknij by wybra kolorClick to select colorQStarDict::CSSEdit.Wybierz rozmiar czionkiSelect font sizeQStarDict::CSSEdit<Idz do &nastpnego tBumaczeniaGo to &next translationQStarDict::DictWidget$Zapisz tBumaczenieSave translationQStarDict::DictWidget*<b>Wersja:</b> %1<br>Version: %1
    QStarDict::SettingsDialog , qstardict-0.12.9.orig/qstardict/translations/qstardict-pt_BR.qm0000644000175000017500000002077011023552141023264 0ustar alexalexQStarDict::SettingsDialogBoldQStarDict::CSSEdit BaixoDownQStarDict::SettingsDialogFontQStarDict::CSSEditInfoQStarDict::SettingsDialogNameQStarDict::SettingsDialogSizeQStarDict::CSSEditjEsperar antes esconder depois de passar o mouse sobre$Timeout before hide after mouse overQStarDict::SettingsDialog&Arquivo&FileQStarDict::MainWindow &Ajuda&HelpQStarDict::MainWindowPlugin: %1
    QStarDict::SettingsDialog &Sair&QuitQStarDict::MainWindow &Sair&QuitQStarDict::TrayIcon &Busca&ScanQStarDict::MainWindow &Busca&ScanQStarDict::TrayIcon LimparClearQStarDict::MainWindowErroErrorQStarDict::DictWidget ShiftShiftQStarDict::SettingsDialogTitleQStarDict::SettingsDialogdisabledQStarDict::TrayIcon!Show information about dictionaryQStarDict::SettingsDialog#Pronounce words using this command:QStarDict::SettingsDialog'Can search similar words: %1
    QStarDict::SettingsDialogXMostrar somente com modificador pressionandoShow only if modifier pressedQStarDict::SettingsDialog,Pronciar esta palavraPronounce the wordQStarDict::SettingsDialog BackgroundQStarDict::CSSEditInstant searchQStarDict::SettingsDialog(&Salvar para arquivo &Save to fileQStarDict::DictWidget &Sobre&AboutQStarDict::MainWindowJanela Popup Popup windowQStarDict::SettingsDialog1QStarDict %1 - Qt version of StarDict
    QStarDict::MainWindowDicionrios DictionariesQStarDict::SettingsDialogInformation about %1 pluginQStarDict::SettingsDialogDictionary nameQStarDict::SettingsDialog.Configuraes QStarDictQStarDict SettingsQStarDict::SettingsDialogText files (*.txt)QStarDict::DictWidgetGo to &previous translationQStarDict::DictWidgetDescription: %1QStarDict::SettingsDialogShow information about pluginQStarDict::SettingsDialog*Limpar caixa de BuscaClear the search boxQStarDict::MainWindowMove upQStarDict::SettingsDialog TranscriptionQStarDict::SettingsDialog Ctrl+QCtrl+QQStarDict::MainWindow ConfigureQStarDict::SettingsDialogItalicQStarDict::CSSEditPluginQStarDict::SettingsDialog BuscarSearchQStarDict::MainWindowpCopyright (C) 2007 Alexander Rodin http://qstardict.ylsoftware.comQStarDict::MainWindowAuthor: %1
    QStarDict::SettingsDialogWords count: %1
    QStarDict::SettingsDialog#000000QStarDict::CSSEdit OpacidadeOpacityQStarDict::SettingsDialog!Information about dictionary "%1"QStarDict::SettingsDialog Show infoQStarDict::SettingsDialogSobre Qt About &QtQStarDict::MainWindowAparencia ApperanceQStarDict::SettingsDialogPluginsQStarDict::SettingsDialogPreviewQStarDict::CSSEditSelect elementQStarDict::CSSEdit ExplanationQStarDict::SettingsDialogName: %1
    QStarDict::SettingsDialogAll translationQStarDict::SettingsDialog AbbreviationQStarDict::SettingsDialogCannot save translation as %1QStarDict::DictWidgetGlobal settingsQStarDict::SettingsDialogFMostrar as palavras no encontradasShow if word not foundQStarDict::SettingsDialog%1 - QStarDictQStarDict::MainWindowQStarDict: scanning is %1QStarDict::TrayIcon Select fontQStarDict::CSSEdit The word %1 is not found.QStarDict::DictBrowserControlControlQStarDict::SettingsDialog QStarDictQStarDict::MainWindow QStarDictQStarDict::TrayIcon UnderlineQStarDict::CSSEditPrin&t translationQStarDict::DictWidgetFuzzy Consulta Fuzzy queryQStarDict::MainWindowBuscar SeleoScan selectionQStarDict::SettingsDialog"Lista de Palavras Words listQStarDict::MainWindowEnter cmd for the speaching program.
    If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process.QStarDict::SettingsDialogConfigure pluginQStarDict::SettingsDialogComportamentoBehaviorQStarDict::SettingsDialog ForegroundQStarDict::CSSEditElementQStarDict::CSSEditSobre QStarDictAbout QStarDictQStarDict::MainWindowenabledQStarDict::TrayIconEnabledQStarDict::SettingsDialogunknownQStarDict::SettingsDialog*&Configurar QStarDict&Configure QStarDictQStarDict::MainWindow*&Configurar QStarDict&Configure QStarDictQStarDict::TrayIcon Move downQStarDict::SettingsDialogAuthors: %1
    QStarDict::SettingsDialog&Configuraes &SettingsQStarDict::MainWindow Largura padro Default widthQStarDict::SettingsDialogExampleQStarDict::SettingsDialogAltura PadroDefault heightQStarDict::SettingsDialog Speak &wordQStarDict::DictWidgetHTML files (*.html, *.htm)QStarDict::DictWidgetNo Esconder Don't hideQStarDict::SettingsDialogClick to select colorQStarDict::CSSEditSelect font sizeQStarDict::CSSEditGo to &next translationQStarDict::DictWidgetSalvar traduoSave translationQStarDict::DictWidgetVersion: %1
    QStarDict::SettingsDialogqstardict-0.12.9.orig/qstardict/translations/qstardict-ru_RU.ts0000644000175000017500000005573011023552141023327 0ustar alexalex QStarDict::CSSEdit Preview Предварительный просмотр Element Элемент Foreground Цвет шрифта Background Цвет фона Select element Выберите элемент Click to select color Нажмите чтобы выбрать элемент #000000 #000000 Font Шрифт Size Размер Select font Выберите шрифт Select font size Выберите размер шрифта pt пт Bold Жирный B Ж Italic Курсив I К Underline Подчеркнутый U П QStarDict::DictBrowser The word <b>%1</b> is not found. Слово <b>%1</b> не найдено. QStarDict::DictWidget Save translation Сохранить перевод HTML files (*.html, *.htm) HTML-файлы (*.html, *.htm) Text files (*.txt) Текстовые файлы (*.txt) Error Ошибка Cannot save translation as %1 Невозможно сохранить перевод как %1 Go to &previous translation Перейти к &предыдущему переводу Go to &next translation Перейти к &следующему переводу &Save to file &Сохранить в файл Speak &word П&роизнести слово Prin&t translation Напечата&ть перевод QStarDict::MainWindow About QStarDict О программе QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> <b>QStarDict %1 </b> - Qt-версия программы StarDict<br> Copyright (C) 2007 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> Copyright (C) 2007 Александр Родин <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict QStarDict %1 - QStarDict %1 - QStarDict Clear the search box Очистить строку поиска Clear Очистить Fuzzy query Неточный запрос Search Поиск Words list Список слов &File &Файл &Help &Справка &Settings &Настройки &Quit &Выход Ctrl+Q Ctrl+Q &About &О программе QStarDict About &Qt О &библиотеке Qt &Configure QStarDict &Конфигурация &Scan &Сканировать QStarDict::SettingsDialog Enabled Включен Name Название Plugin Плагин Information about dictionary "%1" Информация о словаре "%1" <b>Name:</b> %1<br> <b>Название:</b> %1<br> <b>Plugin:</b> %1<br> <b>Плагин:</b> %1<br> unknown неизвестно <b>Description:</b> %1 <b>Описание:</b> %1 Information about %1 plugin Информация о плагине %1 <b>Version:</b> %1<br> <b>Версия:</b> %1<br> <b>Authors:</b> %1<br> <b>Авторы:</b> %1<br> <br> <br> <b>Can search similar words:</b> %1<br> <b>Возможность искать похожие слова:</b> %1<br> yes есть no нет QStarDict Settings Настройки QStarDict Show information about dictionary Показать информацию о словаре Global settings Общие настройки Instant search Поиск при наборе Pronounce words using this command: Произносить слова, используя программу: Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Введите команду для запуска программы.<br>Если команда содержит выражение "%s", оно будет заменено на слово; иначе слово будет записано в стандартный поток ввода процесса. Dictionaries Словари Move up Переместить вверх Up Вверх Move down Переместить вниз Down Вниз Show info Показывать информацию Plugins Плагины Show information about plugin Показать информацию о плагине Info Информация Configure plugin Настроить плагин Configure Настроить Popup window Всплывающее окно Behavior Поведение Pronounce the word Произносить слово Timeout before hide after mouse over Задержка перед скрытием после отведения указателя мыши Don't hide Не скрывать sec сек Show only if modifier pressed Показывать только если нажата клавиша-модификатор Alt Alt Control Control Shift Shift Win Win Scan selection Сканировать выделение Show if word not found Показывать если слово не найдено Apperance Внешний вид Opacity Непрозрачность % % Default width Ширина по умолчанию Default height Высота по умолчанию <b>Author:</b> %1<br> <b>Автор:</b> %1<br> <b>Words count:</b> %1<br> <b>Количество слов:</b> %1<br> All translation Весь перевод Dictionary name Название словаря Title Заголовок Explanation Пояснение Abbreviation Аббревиатура Example Пример употребления слова Transcription Транскрипция QStarDict::TrayIcon QStarDict QStarDict &Scan &Сканировать &Configure QStarDict &Конфигурация &Quit &Выход QStarDict: scanning is %1 QStarDict: сканирование %1 enabled включено disabled выключено qstardict-0.12.9.orig/qstardict/translations/qstardict-bg_BG.ts0000644000175000017500000005464011023552141023232 0ustar alexalex QStarDict::CSSEdit Preview Element Foreground Background Select element Click to select color #000000 Font Size Select font Select font size pt Bold B Italic I Underline U QStarDict::DictBrowser The word <b>%1</b> is not found. QStarDict::DictWidget Save translation Запази превода HTML files (*.html, *.htm) Text files (*.txt) Error Грешка Cannot save translation as %1 Go to &previous translation Go to &next translation &Save to file &Запази във файл Speak &word Prin&t translation QStarDict::MainWindow About QStarDict За QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> Copyright (C) 2007 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> Copyright (C) 2007 Александър Родин <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict QStarDict %1 - QStarDict %1 - QStarDict Clear the search box Изчисти полето за търсене Clear Изчисти Fuzzy query Неясно търсене Search Търси Words list Лист с думи &File &Файл &Help &Помощ &Settings &Настройки &Quit &Изход Ctrl+Q Ctrl+Q &About &За QStarDict About &Qt За &Qt &Configure QStarDict &Настройка на QStarDict &Scan &Сканираща част QStarDict::SettingsDialog Enabled Name Plugin Information about dictionary "%1" <b>Name:</b> %1<br> <b>Plugin:</b> %1<br> unknown <b>Description:</b> %1 Information about %1 plugin <b>Version:</b> %1<br> <b>Authors:</b> %1<br> <br> <b>Can search similar words:</b> %1<br> yes no QStarDict Settings Настройки на QStarDict Show information about dictionary Global settings Instant search Pronounce words using this command: Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Dictionaries Речници Move up Up Нагоре Move down Down Надолу Show info Plugins Show information about plugin Info Configure plugin Configure Popup window Главен прозорец Behavior Поведение Pronounce the word Timeout before hide after mouse over Време, преди да се скрие, след посочване с мишката Don't hide Не крий sec секунди Show only if modifier pressed Покажи, само ако модификатора е натиснат Alt Alt Control Control Shift Shift Win Win Scan selection Селективно сканиране Show if word not found Покажи, ако дума не е намерена Apperance Изглед Opacity Непрозрачност % % Default width Подразбираща се ширина Default height Подразбираща се височина <b>Author:</b> %1<br> <b>Words count:</b> %1<br> All translation Dictionary name Title Explanation Abbreviation Example Transcription QStarDict::TrayIcon QStarDict QStarDict &Scan &Сканираща част &Configure QStarDict &Настройка на QStarDict &Quit &Изход QStarDict: scanning is %1 enabled disabled qstardict-0.12.9.orig/qstardict/translations/qstardict-de_DE.qm0000644000175000017500000002642411023552141023220 0ustar alexalex
    QStarDict::SettingsDialogFettBoldQStarDict::CSSEditAbDownQStarDict::SettingsDialogSchriftartFontQStarDict::CSSEditInfoInfoQStarDict::SettingsDialogNameNameQStarDict::SettingsDialog GreSizeQStarDict::CSSEdit\Zeitdauer bis zum Verschwinden nach Mouse Over$Timeout before hide after mouse overQStarDict::SettingsDialog &Datei&FileQStarDict::MainWindow &Hilfe&HelpQStarDict::MainWindow*<b>Plugin:</b> %1<br>Plugin: %1
    QStarDict::SettingsDialog&Beenden&QuitQStarDict::MainWindow&Beenden&QuitQStarDict::TrayIcon&Scannen&ScanQStarDict::MainWindow&Scannen&ScanQStarDict::TrayIconLschenClearQStarDict::MainWindow FehlerErrorQStarDict::DictWidgetUmschaltShiftQStarDict::SettingsDialog TitelTitleQStarDict::SettingsDialogdeaktiviertdisabledQStarDict::TrayIconJInformationen zum Wrterbuch anzeigen!Show information about dictionaryQStarDict::SettingsDialogXFolgendes Kommando zur Aussprache verwenden:#Pronounce words using this command:QStarDict::SettingsDialogT<b>Kann hnliche Wrter suchen:</b> %1<br>'Can search similar words: %1
    QStarDict::SettingsDialog>Nur zeigen falls Taste gedrcktShow only if modifier pressedQStarDict::SettingsDialog Spreche das WortPronounce the wordQStarDict::SettingsDialogHintergrund BackgroundQStarDict::CSSEditSofortsucheInstant searchQStarDict::SettingsDialog&In &Datei speichern &Save to fileQStarDict::DictWidgetber Q&StarDict&AboutQStarDict::MainWindowPopup-Fenster Popup windowQStarDict::SettingsDialogd<b>QStarDict %1 </b> - Qt-Version von StarDict<br>1QStarDict %1 - Qt version of StarDict
    QStarDict::MainWindowWrterbcher DictionariesQStarDict::SettingsDialog:Informationen zum Plugin "%1"Information about %1 pluginQStarDict::SettingsDialogWrterbuchnameDictionary nameQStarDict::SettingsDialog0QStarDicts EinstellungenQStarDict SettingsQStarDict::SettingsDialog&Textdateien (*.txt)Text files (*.txt)QStarDict::DictWidget<Gehe zur &nchsten bersetzungGo to &previous translationQStarDict::DictWidget.<b>Beschreibung:</b> %1Description: %1QStarDict::SettingsDialogBInformationen zum Plugin anzeigenShow information about pluginQStarDict::SettingsDialog&Das Suchfeld leerenClear the search boxQStarDict::MainWindowNach obenMove upQStarDict::SettingsDialogAbschrift TranscriptionQStarDict::SettingsDialog Strg+QCtrl+QQStarDict::MainWindowKonfigurieren ConfigureQStarDict::SettingsDialog KursivItalicQStarDict::CSSEdit PluginPluginQStarDict::SettingsDialog SucheSearchQStarDict::MainWindowCopyright (C) 2007Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a>pCopyright (C) 2007 Alexander Rodin http://qstardict.ylsoftware.comQStarDict::MainWindow(<b>Autor:</b> %1<br>Author: %1
    QStarDict::SettingsDialog@<b>Enthaltene Wrter:</b> %1<br>Words count: %1
    QStarDict::SettingsDialog#000000#000000QStarDict::CSSEditOpazittOpacityQStarDict::SettingsDialogBInformationen zum Wrterbuch "%1"!Information about dictionary "%1"QStarDict::SettingsDialog,Informationen anzeigen Show infoQStarDict::SettingsDialogber &Qt About &QtQStarDict::MainWindow Erscheinungsbild ApperanceQStarDict::SettingsDialogPluginsPluginsQStarDict::SettingsDialogVorschauPreviewQStarDict::CSSEditElement whlenSelect elementQStarDict::CSSEditErluterung ExplanationQStarDict::SettingsDialog&<b>Name:</b> %1<br>Name: %1
    QStarDict::SettingsDialog$Alle bersetzungenAll translationQStarDict::SettingsDialogAbkrzung AbbreviationQStarDict::SettingsDialogNKann bersetzung nicht als %1 speichernCannot save translation as %1QStarDict::DictWidget*Globale EinstellungenGlobal settingsQStarDict::SettingsDialogDAnzeigen falls Wort nicht gefundenShow if word not foundQStarDict::SettingsDialog%1 - QStarDict%1 - QStarDictQStarDict::MainWindow2QStarDict: Scannen ist %1QStarDict: scanning is %1QStarDict::TrayIcon"Schriftart whlen Select fontQStarDict::CSSEditPDas Wort <b>%1</b> wurde nicht gefunden. The word %1 is not found.QStarDict::DictBrowserStrgControlQStarDict::SettingsDialogQStarDict QStarDictQStarDict::MainWindowQStarDict QStarDictQStarDict::TrayIconUnterstrichen UnderlineQStarDict::CSSEdit(bersetzung &druckenPrin&t translationQStarDict::DictWidgetUngenaue Suche Fuzzy queryQStarDict::MainWindowAuswahl scannenScan selectionQStarDict::SettingsDialogWrterliste Words listQStarDict::MainWindowGeben Sie das Kommando fr das Ausspracheprogramm ein.<br>Falls das Kommando "%s" enthlt, wird dies durch das Wort ersetzt, andernfalls wird das Wort auf die stdin des Sprachprozesses geschrieben.Enter cmd for the speaching program.
    If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process.QStarDict::SettingsDialog(Plugin konfigurierenConfigure pluginQStarDict::SettingsDialogVerhaltenBehaviorQStarDict::SettingsDialogVordergrund ForegroundQStarDict::CSSEditElementElementQStarDict::CSSEditber QStarDictAbout QStarDictQStarDict::MainWindowaktiviertenabledQStarDict::TrayIconAktiviertEnabledQStarDict::SettingsDialogunbekanntunknownQStarDict::SettingsDialog0QStarDict &konfigurieren&Configure QStarDictQStarDict::MainWindow0QStarDict &konfigurieren&Configure QStarDictQStarDict::TrayIconNach unten Move downQStarDict::SettingsDialog,<b>Autoren:</b> %1<br>Authors: %1
    QStarDict::SettingsDialog&Einstellungen &SettingsQStarDict::MainWindowStandardbreite Default widthQStarDict::SettingsDialogBeispielExampleQStarDict::SettingsDialogStandardhheDefault heightQStarDict::SettingsDialog"&Wort aussprechen Speak &wordQStarDict::DictWidget8HTML-Dateien (*.html, *.htm)HTML files (*.html, *.htm)QStarDict::DictWidget Nicht verstecken Don't hideQStarDict::SettingsDialog.Klicken zur FarbauswahlClick to select colorQStarDict::CSSEdit&Schriftgre whlenSelect font sizeQStarDict::CSSEdit@Gehe zur &vorherigen bersetzungGo to &next translationQStarDict::DictWidget*bersetzung speichernSave translationQStarDict::DictWidget,<b>Version:</b> %1<br>Version: %1
    QStarDict::SettingsDialogqstardict-0.12.9.orig/qstardict/translations/qstardict-zh_TW.qm0000644000175000017500000002157111023552141023311 0ustar alexalexQStarDict::SettingsDialog|BoldQStarDict::CSSEditN DownQStarDict::SettingsDialog[WWFontQStarDict::CSSEditNJ InfoQStarDict::SettingsDialogT z1NameQStarDict::SettingsDialogY'\SizeQStarDict::CSSEditnџ aP\ϐ>fB$Timeout before hide after mouse overQStarDict::SettingsDialog jhH(&F)&FileQStarDict::MainWindow f(&H)&HelpQStarDict::MainWindow&<b>Ycz _</b> %1<br>Plugin: %1
    QStarDict::SettingsDialog ╋(&Q)&QuitQStarDict::MainWindow ╋(&Q)&QuitQStarDict::TrayIcon S֊^(&S)&ScanQStarDict::MainWindow S֊^(&S)&ScanQStarDict::TrayIconndClearQStarDict::MainWindow/ErrorQStarDict::DictWidget ShiftShiftQStarDict::SettingsDialogjLTitleQStarDict::SettingsDialogdisabledQStarDict::TrayIcon oy:[WQxNJ !Show information about dictionaryQStarDict::SettingsDialogOu(YN cNv|#Pronounce words using this command:QStarDict::SettingsDialog.<b>SNd\ vO %1<br>'Can search similar words: %1
    QStarDict::SettingsDialogoy: Puvc N Show only if modifier pressedQStarDict::SettingsDialogU[Wv|Pronounce the wordQStarDict::SettingsDialogfo BackgroundQStarDict::CSSEditSsfBd\ Instant searchQStarDict::SettingsDialogQ2[XR0jhH(&S) &Save to fileQStarDict::DictWidget e(&A)&AboutQStarDict::MainWindow_oz Popup windowQStarDict::SettingsDialog1QStarDict %1 - Qt version of StarDict
    QStarDict::MainWindow[WQx DictionariesQStarDict::SettingsDialogeYcz _ %1 vNJ Information about %1 pluginQStarDict::SettingsDialog[WQxT z1Dictionary nameQStarDict::SettingsDialogQStarDict -[QStarDict SettingsQStarDict::SettingsDialoge[WjText files (*.txt)QStarDict::DictWidgetRMNP o (&p)Go to &previous translationQStarDict::DictWidget<b>f</b> %1Description: %1QStarDict::SettingsDialogoy:Ycz _NJ Show information about pluginQStarDict::SettingsDialog ndd\ hFClear the search boxQStarDict::MainWindowN yMove upQStarDict::SettingsDialog TranscriptionQStarDict::SettingsDialog Ctrl+QCtrl+QQStarDict::MainWindow-[ ConfigureQStarDict::SettingsDialogeItalicQStarDict::CSSEditYcz _PluginQStarDict::SettingsDialogd\ SearchQStarDict::MainWindowrHk (C) 2007 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a>pCopyright (C) 2007 Alexander Rodin http://qstardict.ylsoftware.comQStarDict::MainWindow"<b>O\:</b> %1<br>Author: %1
    QStarDict::SettingsDialog$<b>U[Wex:</b> %1<br>Words count: %1
    QStarDict::SettingsDialog#000000#000000QStarDict::CSSEditN f^OpacityQStarDict::SettingsDialog[WQx"%1" vNJ !Information about dictionary "%1"QStarDict::SettingsDialogoy:NJ  Show infoQStarDict::SettingsDialog e Qt About &QtQStarDict::MainWindowY ApperanceQStarDict::SettingsDialogYcz _PluginsQStarDict::SettingsDialogPreviewQStarDict::CSSEditxSQC} Select elementQStarDict::CSSEdit ExplanationQStarDict::SettingsDialog&<b>[WQxT z1:</b> %1<br>Name: %1
    QStarDict::SettingsDialog b@g voAll translationQStarDict::SettingsDialog~.[ AbbreviationQStarDict::SettingsDialogq!l\oQ2[Xp %1Cannot save translation as %1QStarDict::DictWidgetQhWߊ-[Global settingsQStarDict::SettingsDialoguvg*b~R0[WfBoy:Show if word not foundQStarDict::SettingsDialog%1 - QStarDict%1 - QStarDictQStarDict::MainWindowQStarDict: scanning is %1QStarDict::TrayIconxS[WW Select fontQStarDict::CSSEdit b~N R0U[W <b>%1</b>  The word %1 is not found.QStarDict::DictBrowserControlControlQStarDict::SettingsDialogQStarDict QStarDictQStarDict::MainWindowQStarDict QStarDictQStarDict::TrayIcon^} UnderlineQStarDict::CSSEditRSpo(&t)Prin&t translationQStarDict::DictWidgetj!|gb Fuzzy queryQStarDict::MainWindow xSS@S֊^Scan selectionQStarDict::SettingsDialog[W_YnU Words listQStarDict::MainWindowEnter cmd for the speaching program.
    If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process.QStarDict::SettingsDialog -[Ycz _Configure pluginQStarDict::SettingsDialogLpBehaviorQStarDict::SettingsDialogRMfo ForegroundQStarDict::CSSEditQC} ElementQStarDict::CSSEdite QStarDictAbout QStarDictQStarDict::MainWindowenabledQStarDict::TrayIconU_u(EnabledQStarDict::SettingsDialogg*wunknownQStarDict::SettingsDialog -[ QStarDict(&C)&Configure QStarDictQStarDict::MainWindow -[ QStarDict(&C)&Configure QStarDictQStarDict::TrayIconN y Move downQStarDict::SettingsDialog"<b>O\</b> %1<br>Authors: %1
    QStarDict::SettingsDialog&-[ &SettingsQStarDict::MainWindow-[^ Default widthQStarDict::SettingsDialog{OExampleQStarDict::SettingsDialog-^Default heightQStarDict::SettingsDialogQU[W (&w) Speak &wordQStarDict::DictWidget*HTMLjhH(*.html, *.htm)HTML files (*.html, *.htm)QStarDict::DictWidgetN  Don't hideQStarDict::SettingsDialogސxr_iClick to select colorQStarDict::CSSEdit xS[WWY'\Select font sizeQStarDict::CSSEdit_NP o (&n)Go to &next translationQStarDict::DictWidgetQ2[XoSave translationQStarDict::DictWidget"<b>rHg,</b> %1<br>Version: %1
    QStarDict::SettingsDialogqstardict-0.12.9.orig/qstardict/translations/qstardict-it_IT.ts0000644000175000017500000005301711023552141023277 0ustar alexalex QStarDict::CSSEdit Preview Anteprima Element Elemento Foreground Primo piano Background Sfondo Select element Seleziona elementi Click to select color Click per selezionare il colore #000000 #000000 Font Carattere Size Dimensione Select font Seleziona carattere Select font size Seleziona dimensione carattere pt pt Bold Grassetto B B Italic Corsivo I I Underline Sottolineato U U QStarDict::DictBrowser The word <b>%1</b> is not found. La parola <b>%1</b> non è stata trovata. QStarDict::DictWidget Save translation Salva la traduzione HTML files (*.html, *.htm) File HTML (*.html, *.htm) Text files (*.txt) File di testo (*.txt) Error Errore Cannot save translation as %1 Non posso salvare la traduzione come %1 Go to &previous translation Vai alla traduzione &precedente Go to &next translation Vai alla traduzione s&uccessiva &Save to file &Salva come Speak &word Pronuncia f&rase Prin&t translation S&tampa traduzione QStarDict::MainWindow About QStarDict Informazioni su QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> <b>QStarDict %1 </b> - Versione Qt di StarDict<br> Copyright (C) 2007 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> Copyright (C) 2007 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict QStarDict %1 - QStarDict %1 - QStarDict Clear the search box Cancella la ricerca Clear Cancella Fuzzy query Fuzzy query Search Cerca Words list Lista delle Frasi &File &File &Help &Aiuto &Settings &Impostazioni &Quit &Esci Ctrl+Q Ctrl+Q &About I&nformazioni su About &Qt Informazioni su &Qt &Configure QStarDict C&onfigura QStarDict &Scan &Cerca QStarDict::SettingsDialog Enabled Attivato Name Nome Plugin Estensione Information about dictionary "%1" Informazione sul dizionario "%1" <b>Name:</b> %1<br> <b>Nome:</b> %1<br> <b>Plugin:</b> %1<br> <b>Estensione:</b> %1<br> unknown ignoto <b>Description:</b> %1 <b>Descrizione:</b> %1 Information about %1 plugin Informazione sull'estensione %1 <b>Version:</b> %1<br> <b>Versione:</b> %1<br> <b>Authors:</b> %1<br> <b>Autori:</b> %1<br> <br> <br> <b>Can search similar words:</b> %1<br> <b>Puoi cercare parole simili:</b> %1<br> yes si no no QStarDict Settings Impostazioni QStarDict Show information about dictionary Mostra informazioni sul dizionario Global settings Impostazioni globali Instant search Ricerca istantanea Pronounce words using this command: Pronuncia le parole usando questo comando: Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Inserisci il comando per il programma di pronuncia.<br>Se il comando contiene "%s" la parola verrà sostituita, altrimenti la parola sarà scritta nello stdin del processo di pronuncia. Dictionaries Dizionari Move up Sposta in su Up Su Move down Sposta in giù Down Giù Show info Mostra informazioni Plugins Estensioni Show information about plugin Mostra informazioni sull'estensione Info Informazioni Configure plugin Configura estensione Configure Configura Popup window Finestra di popup Behavior Comportamento Pronounce the word Pronuncia la parola Timeout before hide after mouse over Tempo di scomparsa dopo aver mosso il mouse Don't hide Non nascondere sec sec Show only if modifier pressed Mostra solo se si preme Alt Alt Control Control Shift Shift Win Win Scan selection Cerca selezione Show if word not found Mostra se la parola non viene trovata Apperance Aspetto Opacity Opacità % % Default width Ampiezza di default Default height Altezza di default <b>Author:</b> %1<br> <b>Autore:</b> %1<br> <b>Words count:</b> %1<br> <b>Conto parole:</b> %1<br> All translation Tutta la traduzione Dictionary name Nome del dizionario Title Titolo Explanation Spiegazione Abbreviation Abbreviazione Example Esempio Transcription Trascrizione QStarDict::TrayIcon QStarDict QStarDict &Scan &Cerca &Configure QStarDict &Configura QStarDict &Quit &Esci QStarDict: scanning is %1 enabled disabled qstardict-0.12.9.orig/qstardict/translations/qstardict-it_IT.qm0000644000175000017500000002637011023552141023270 0ustar alexalex
    QStarDict::SettingsDialogGrassettoBoldQStarDict::CSSEditGiDownQStarDict::SettingsDialogCarattereFontQStarDict::CSSEditInformazioniInfoQStarDict::SettingsDialogNomeNameQStarDict::SettingsDialogDimensioneSizeQStarDict::CSSEditVTempo di scomparsa dopo aver mosso il mouse$Timeout before hide after mouse overQStarDict::SettingsDialog &File&FileQStarDict::MainWindow &Aiuto&HelpQStarDict::MainWindow2<b>Estensione:</b> %1<br>Plugin: %1
    QStarDict::SettingsDialog &Esci&QuitQStarDict::MainWindow &Esci&QuitQStarDict::TrayIcon &Cerca&ScanQStarDict::MainWindow &Cerca&ScanQStarDict::TrayIconCancellaClearQStarDict::MainWindow ErroreErrorQStarDict::DictWidget ShiftShiftQStarDict::SettingsDialog TitoloTitleQStarDict::SettingsDialogdisabledQStarDict::TrayIconDMostra informazioni sul dizionario!Show information about dictionaryQStarDict::SettingsDialogTPronuncia le parole usando questo comando:#Pronounce words using this command:QStarDict::SettingsDialogR<b>Puoi cercare parole simili:</b> %1<br>'Can search similar words: %1
    QStarDict::SettingsDialog.Mostra solo se si premeShow only if modifier pressedQStarDict::SettingsDialog&Pronuncia la parolaPronounce the wordQStarDict::SettingsDialog Sfondo BackgroundQStarDict::CSSEdit$Ricerca istantaneaInstant searchQStarDict::SettingsDialog&Salva come &Save to fileQStarDict::DictWidget I&nformazioni su&AboutQStarDict::MainWindow"Finestra di popup Popup windowQStarDict::SettingsDialogd<b>QStarDict %1 </b> - Versione Qt di StarDict<br>1QStarDict %1 - Qt version of StarDict
    QStarDict::MainWindowDizionari DictionariesQStarDict::SettingsDialog>Informazione sull'estensione %1Information about %1 pluginQStarDict::SettingsDialog&Nome del dizionarioDictionary nameQStarDict::SettingsDialog,Impostazioni QStarDictQStarDict SettingsQStarDict::SettingsDialog*File di testo (*.txt)Text files (*.txt)QStarDict::DictWidget>Vai alla traduzione &precedenteGo to &previous translationQStarDict::DictWidget,<b>Descrizione:</b> %1Description: %1QStarDict::SettingsDialogFMostra informazioni sull'estensioneShow information about pluginQStarDict::SettingsDialog&Cancella la ricercaClear the search boxQStarDict::MainWindowSposta in suMove upQStarDict::SettingsDialogTrascrizione TranscriptionQStarDict::SettingsDialog Ctrl+QCtrl+QQStarDict::MainWindowConfigura ConfigureQStarDict::SettingsDialogCorsivoItalicQStarDict::CSSEditEstensionePluginQStarDict::SettingsDialog CercaSearchQStarDict::MainWindowCopyright (C) 2007 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a>pCopyright (C) 2007 Alexander Rodin http://qstardict.ylsoftware.comQStarDict::MainWindow*<b>Autore:</b> %1<br>Author: %1
    QStarDict::SettingsDialog6<b>Conto parole:</b> %1<br>Words count: %1
    QStarDict::SettingsDialog#000000#000000QStarDict::CSSEditOpacitOpacityQStarDict::SettingsDialog@Informazione sul dizionario "%1"!Information about dictionary "%1"QStarDict::SettingsDialog&Mostra informazioni Show infoQStarDict::SettingsDialog&Informazioni su &Qt About &QtQStarDict::MainWindowAspetto ApperanceQStarDict::SettingsDialogEstensioniPluginsQStarDict::SettingsDialogAnteprimaPreviewQStarDict::CSSEdit$Seleziona elementiSelect elementQStarDict::CSSEditSpiegazione ExplanationQStarDict::SettingsDialog&<b>Nome:</b> %1<br>Name: %1
    QStarDict::SettingsDialog&Tutta la traduzioneAll translationQStarDict::SettingsDialogAbbreviazione AbbreviationQStarDict::SettingsDialogNNon posso salvare la traduzione come %1Cannot save translation as %1QStarDict::DictWidget(Impostazioni globaliGlobal settingsQStarDict::SettingsDialogJMostra se la parola non viene trovataShow if word not foundQStarDict::SettingsDialog%1 - QStarDict%1 - QStarDictQStarDict::MainWindowQStarDict: scanning is %1QStarDict::TrayIcon&Seleziona carattere Select fontQStarDict::CSSEditPLa parola <b>%1</b> non stata trovata. The word %1 is not found.QStarDict::DictBrowserControlControlQStarDict::SettingsDialogQStarDict QStarDictQStarDict::MainWindowQStarDict QStarDictQStarDict::TrayIconSottolineato UnderlineQStarDict::CSSEdit$S&tampa traduzionePrin&t translationQStarDict::DictWidgetFuzzy query Fuzzy queryQStarDict::MainWindowCerca selezioneScan selectionQStarDict::SettingsDialog"Lista delle Frasi Words listQStarDict::MainWindownInserisci il comando per il programma di pronuncia.<br>Se il comando contiene "%s" la parola verr sostituita, altrimenti la parola sar scritta nello stdin del processo di pronuncia.Enter cmd for the speaching program.
    If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process.QStarDict::SettingsDialog(Configura estensioneConfigure pluginQStarDict::SettingsDialogComportamentoBehaviorQStarDict::SettingsDialogPrimo piano ForegroundQStarDict::CSSEditElementoElementQStarDict::CSSEdit2Informazioni su QStarDictAbout QStarDictQStarDict::MainWindowenabledQStarDict::TrayIconAttivatoEnabledQStarDict::SettingsDialog ignotounknownQStarDict::SettingsDialog(C&onfigura QStarDict&Configure QStarDictQStarDict::MainWindow(&Configura QStarDict&Configure QStarDictQStarDict::TrayIconSposta in gi Move downQStarDict::SettingsDialog*<b>Autori:</b> %1<br>Authors: %1
    QStarDict::SettingsDialog&Impostazioni &SettingsQStarDict::MainWindow&Ampiezza di default Default widthQStarDict::SettingsDialogEsempioExampleQStarDict::SettingsDialog$Altezza di defaultDefault heightQStarDict::SettingsDialog Pronuncia f&rase Speak &wordQStarDict::DictWidget2File HTML (*.html, *.htm)HTML files (*.html, *.htm)QStarDict::DictWidgetNon nascondere Don't hideQStarDict::SettingsDialog>Click per selezionare il coloreClick to select colorQStarDict::CSSEdit<Seleziona dimensione carattereSelect font sizeQStarDict::CSSEdit>Vai alla traduzione s&uccessivaGo to &next translationQStarDict::DictWidget&Salva la traduzioneSave translationQStarDict::DictWidget.<b>Versione:</b> %1<br>Version: %1
    QStarDict::SettingsDialogqstardict-0.12.9.orig/qstardict/translations/qstardict-bg_BG.qm0000644000175000017500000002141711023552141023215 0ustar alexalex]uy)^$OzTH5Gr*%(*0a++++~S+~J+Lb(Yc[ %R(eGD1  u @ 7G  9$  jE %*I b) . 7q OC U lw N  Ϧ  1s^=ؐ^Hw33g 2P?lL;XϗY~;7.)S.j8 g! =mC( e  ]9 ?z aQ e :  t *( 5n. :n T$ le-  ' o ,< @ G GN RV e4D e4D$ w  s wP Ge #:4 wX bYoYrS0sNV.!ie%%QStarDict::SettingsDialogBQStarDict::CSSEditIQStarDict::CSSEditUQStarDict::CSSEdit 03>@5UpQStarDict::SettingsDialognoQStarDict::SettingsDialogptQStarDict::CSSEditAltAltQStarDict::SettingsDialogWinWinQStarDict::SettingsDialogyesQStarDict::SettingsDialogA5:C=48 secQStarDict::SettingsDialog
    QStarDict::SettingsDialogBoldQStarDict::CSSEdit 04>;CDownQStarDict::SettingsDialogFontQStarDict::CSSEditInfoQStarDict::SettingsDialogNameQStarDict::SettingsDialogSizeQStarDict::CSSEditd@5<5, ?@548 40 A5 A:@85, A;54 ?>A>G20=5 A <8H:0B0$Timeout before hide after mouse overQStarDict::SettingsDialog &$09;&FileQStarDict::MainWindow &><>I&HelpQStarDict::MainWindowPlugin: %1
    QStarDict::SettingsDialog &7E>4&QuitQStarDict::MainWindow &7E>4&QuitQStarDict::TrayIcon&!:0=8@0I0 G0AB&ScanQStarDict::MainWindow&!:0=8@0I0 G0AB&ScanQStarDict::TrayIcon7G8AB8ClearQStarDict::MainWindow @5H:0ErrorQStarDict::DictWidget ShiftShiftQStarDict::SettingsDialogTitleQStarDict::SettingsDialogdisabledQStarDict::TrayIcon!Show information about dictionaryQStarDict::SettingsDialog#Pronounce words using this command:QStarDict::SettingsDialog'Can search similar words: %1
    QStarDict::SettingsDialogP>:068, A0<> 0:> <>48D8:0B>@0 5 =0B8A=0BShow only if modifier pressedQStarDict::SettingsDialogPronounce the wordQStarDict::SettingsDialog BackgroundQStarDict::CSSEditInstant searchQStarDict::SettingsDialog &0?078 2J2 D09; &Save to fileQStarDict::DictWidget&0 QStarDict&AboutQStarDict::MainWindow;025= ?@>7>@5F Popup windowQStarDict::SettingsDialog1QStarDict %1 - Qt version of StarDict
    QStarDict::MainWindow 5G=8F8 DictionariesQStarDict::SettingsDialogInformation about %1 pluginQStarDict::SettingsDialogDictionary nameQStarDict::SettingsDialog,0AB@>9:8 =0 QStarDictQStarDict SettingsQStarDict::SettingsDialogText files (*.txt)QStarDict::DictWidgetGo to &previous translationQStarDict::DictWidgetDescription: %1QStarDict::SettingsDialogShow information about pluginQStarDict::SettingsDialog27G8AB8 ?>;5B> 70 BJ@A5=5Clear the search boxQStarDict::MainWindowMove upQStarDict::SettingsDialog TranscriptionQStarDict::SettingsDialog Ctrl+QCtrl+QQStarDict::MainWindow ConfigureQStarDict::SettingsDialogItalicQStarDict::CSSEditPluginQStarDict::SettingsDialog "J@A8SearchQStarDict::MainWindowCopyright (C) 2007 ;5:A0=4J@  >48= <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a>pCopyright (C) 2007 Alexander Rodin http://qstardict.ylsoftware.comQStarDict::MainWindowAuthor: %1
    QStarDict::SettingsDialogWords count: %1
    QStarDict::SettingsDialog#000000QStarDict::CSSEdit5?@>7@0G=>ABOpacityQStarDict::SettingsDialog!Information about dictionary "%1"QStarDict::SettingsDialog Show infoQStarDict::SettingsDialog 0 &Qt About &QtQStarDict::MainWindow 73;54 ApperanceQStarDict::SettingsDialogPluginsQStarDict::SettingsDialogPreviewQStarDict::CSSEditSelect elementQStarDict::CSSEdit ExplanationQStarDict::SettingsDialogName: %1
    QStarDict::SettingsDialogAll translationQStarDict::SettingsDialog AbbreviationQStarDict::SettingsDialogCannot save translation as %1QStarDict::DictWidgetGlobal settingsQStarDict::SettingsDialog<>:068, 0:> 4C<0 =5 5 =0<5@5=0Show if word not foundQStarDict::SettingsDialog%1 - QStarDict%1 - QStarDictQStarDict::MainWindowQStarDict: scanning is %1QStarDict::TrayIcon Select fontQStarDict::CSSEdit The word %1 is not found.QStarDict::DictBrowserControlControlQStarDict::SettingsDialogQStarDict QStarDictQStarDict::MainWindowQStarDict QStarDictQStarDict::TrayIcon UnderlineQStarDict::CSSEditPrin&t translationQStarDict::DictWidget5OA=> BJ@A5=5 Fuzzy queryQStarDict::MainWindow(!5;5:B82=> A:0=8@0=5Scan selectionQStarDict::SettingsDialog8AB A 4C<8 Words listQStarDict::MainWindowEnter cmd for the speaching program.
    If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process.QStarDict::SettingsDialogConfigure pluginQStarDict::SettingsDialog>2545=85BehaviorQStarDict::SettingsDialog ForegroundQStarDict::CSSEditElementQStarDict::CSSEdit0 QStarDictAbout QStarDictQStarDict::MainWindowenabledQStarDict::TrayIconEnabledQStarDict::SettingsDialogunknownQStarDict::SettingsDialog.&0AB@>9:0 =0 QStarDict&Configure QStarDictQStarDict::MainWindow.&0AB@>9:0 =0 QStarDict&Configure QStarDictQStarDict::TrayIcon Move downQStarDict::SettingsDialogAuthors: %1
    QStarDict::SettingsDialog&0AB@>9:8 &SettingsQStarDict::MainWindow,>4@0718@0I0 A5 H8@8=0 Default widthQStarDict::SettingsDialogExampleQStarDict::SettingsDialog0>4@0718@0I0 A5 28A>G8=0Default heightQStarDict::SettingsDialog Speak &wordQStarDict::DictWidgetHTML files (*.html, *.htm)QStarDict::DictWidget5 :@89 Don't hideQStarDict::SettingsDialogClick to select colorQStarDict::CSSEditSelect font sizeQStarDict::CSSEditGo to &next translationQStarDict::DictWidget0?078 ?@52>40Save translationQStarDict::DictWidgetVersion: %1
    QStarDict::SettingsDialogqstardict-0.12.9.orig/qstardict/translations/qstardict-ua_UA.qm0000644000175000017500000002503711023552141023251 0ustar alexalexQStarDict::SettingsDialog 8@=89BoldQStarDict::CSSEdit=87DownQStarDict::SettingsDialog (@8DBFontQStarDict::CSSEdit=D>InfoQStarDict::SettingsDialog<'ONameQStarDict::SettingsDialog  >7<V@SizeQStarDict::CSSEditt0B@8<:0 ?@8E>2C20==O ?iA;O "2B5Gi" <8Hi 7 2i:=0 ?5@5:;040$Timeout before hide after mouse overQStarDict::SettingsDialog &$09;&FileQStarDict::MainWindow&>2i4:0&HelpQStarDict::MainWindow*<b>;03V=:</b> %1<br>Plugin: %1
    QStarDict::SettingsDialog &8Ei4&QuitQStarDict::MainWindow &8Ei4&QuitQStarDict::TrayIcon&!:0=C20B8&ScanQStarDict::MainWindow&!:0=C20B8&ScanQStarDict::TrayIcon>G8AB8B8ClearQStarDict::MainWindow><8;:0ErrorQStarDict::DictWidget ShiftShiftQStarDict::SettingsDialog03>;>2>:TitleQStarDict::SettingsDialogdisabledQStarDict::TrayIcon>>:070B8 V=D>@<0FVN ?@> A;>2=8:!Show information about dictionaryQStarDict::SettingsDialogX8<>2;OB8 A;>20, 28:>@8AB>2CNG8 FN :><0=4C: #Pronounce words using this command:QStarDict::SettingsDialogF<b>(C:0B8 ?>4V1=V A;>20:</b> %1<br>'Can search similar words: %1
    QStarDict::SettingsDialogh>:07C20B8 Bi;L:8 O:I> =0B8A=CB0 :;02iH0-<>48Di:0B>@Show only if modifier pressedQStarDict::SettingsDialog8<>28B8 A;>2>Pronounce the wordQStarDict::SettingsDialog04=V9 ?;0= BackgroundQStarDict::CSSEdit8BBT289 ?>HC:Instant searchQStarDict::SettingsDialog &15@53B8 2 D09; &Save to fileQStarDict::DictWidget.&@> ?@>3@0<C QStarDict&AboutQStarDict::MainWindow$i:=> ?>2i4><;5==O Popup windowQStarDict::SettingsDialog1QStarDict %1 - Qt version of StarDict
    QStarDict::MainWindow!;>2=8:8 DictionariesQStarDict::SettingsDialog0=D>@<0FVO ?@> %1 ?;03V=Information about %1 pluginQStarDict::SettingsDialog<'O A;>2=8:0Dictionary nameQStarDict::SettingsDialog,0;0HBC20==O QStarDictQStarDict SettingsQStarDict::SettingsDialogText files (*.txt)QStarDict::DictWidgetGo to &previous translationQStarDict::DictWidget<b>?8A:</b> %1Description: %1QStarDict::SettingsDialog<>:070B8 V=D>@<0FVN ?@> ?;03V=Show information about pluginQStarDict::SettingsDialog*G8AB8B8 @O4>: ?>HC:CClear the search boxQStarDict::MainWindow5@59B8 225@EMove upQStarDict::SettingsDialog"@0=A:@8?FVO TranscriptionQStarDict::SettingsDialog Ctrl+QCtrl+QQStarDict::MainWindow>=DV3C@0FVO ConfigureQStarDict::SettingsDialog C@A82ItalicQStarDict::CSSEdit ;03V=PluginQStarDict::SettingsDialog >HC:SearchQStarDict::MainWindowCopyright (C) 2007 ;5:A0=4@  >48= <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a>pCopyright (C) 2007 Alexander Rodin http://qstardict.ylsoftware.comQStarDict::MainWindow(<b>2B>@:</b> %1<br>Author: %1
    QStarDict::SettingsDialog:<b>V;L:VABL A;V2:</b> %1<br>Words count: %1
    QStarDict::SettingsDialog#000000QStarDict::CSSEdit5?@>7>@iABLOpacityQStarDict::SettingsDialog6=D>@<0FVO ?@> A;>2=8: "%1"!Information about dictionary "%1"QStarDict::SettingsDialog&>:070B8 V=D>@<0FVN Show infoQStarDict::SettingsDialog$@> &1i1;i>B5:C Qt About &QtQStarDict::MainWindow >2=iH=i9 283;O4 ApperanceQStarDict::SettingsDialog;03V=8PluginsQStarDict::SettingsDialog&>?5@54=V9 ?5@53;O4PreviewQStarDict::CSSEdit81V@ 5;5<5=B0Select elementQStarDict::CSSEdit@>3>;>H5==O ExplanationQStarDict::SettingsDialog&<b><'O:</b> %1<br>Name: %1
    QStarDict::SettingsDialogAV ?5@5:;048All translationQStarDict::SettingsDialog1@52V0BC@8 AbbreviationQStarDict::SettingsDialogCannot save translation as %1QStarDict::DictWidget,;>10;L=V =0;0HBC20==OGlobal settingsQStarDict::SettingsDialogD>:07C20B8, O:I> A;>2> =5 7=0945=>Show if word not foundQStarDict::SettingsDialog%1 - QStarDictQStarDict::MainWindowQStarDict: scanning is %1QStarDict::TrayIcon81V@ H@8DBC Select fontQStarDict::CSSEdit The word %1 is not found.QStarDict::DictBrowserControlControlQStarDict::SettingsDialogQStarDict QStarDictQStarDict::MainWindowQStarDict QStarDictQStarDict::TrayIconV4:@5A;5=89 UnderlineQStarDict::CSSEditPrin&t translationQStarDict::DictWidget5GiB:89 70?8B Fuzzy queryQStarDict::MainWindow&!:0=C20B8 284i;5==OScan selectionQStarDict::SettingsDialog!?8A>: A;i2 Words listQStarDict::MainWindow254VBL :><0=4C 4;O @>7<>2=>W ?@>3@0<8. <br>/:I> :><0=40 <VAB8BL "%s" F5 1C45 70<V=5=> A;>2><, V=a:H5 A;>2> 1C45 70?8A0=> =0 stdin.Enter cmd for the speaching program.
    If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process.QStarDict::SettingsDialog$0;0HBC20B8 ?;03V=Configure pluginQStarDict::SettingsDialog>254i=:0BehaviorQStarDict::SettingsDialog5@54=V9 ?;0= ForegroundQStarDict::CSSEdit;5<5=BElementQStarDict::CSSEdit,@> ?@>3@0<C QStarDictAbout QStarDictQStarDict::MainWindowenabledQStarDict::TrayIcon:;NG5=>EnabledQStarDict::SettingsDialog=52V4><>unknownQStarDict::SettingsDialog&>=Di3C@0FiO&Configure QStarDictQStarDict::MainWindow&>=Di3C@0FiO&Configure QStarDictQStarDict::TrayIcon5@59B8 2=87 Move downQStarDict::SettingsDialog*<b>2B>@8:</b> %1<br>Authors: %1
    QStarDict::SettingsDialog&0;0HBC20==O &SettingsQStarDict::MainWindow.(8@8=0 70 70<>2GC20==O< Default widthQStarDict::SettingsDialog@8:;04ExampleQStarDict::SettingsDialog.8A>B0 70 70<>2GC20==O<Default heightQStarDict::SettingsDialog Speak &wordQStarDict::DictWidgetHTML files (*.html, *.htm)QStarDict::DictWidget5 ?@8E>2C20B8 Don't hideQStarDict::SettingsDialog.;V: 4;O 281>@C :>;L>@CClick to select colorQStarDict::CSSEdit(81V@ @>7<V@C H@8DBCSelect font sizeQStarDict::CSSEditGo to &next translationQStarDict::DictWidget"15@53B8 ?5@5:;04Save translationQStarDict::DictWidget*<b>5@AVO:</b> %1<br>Version: %1
    QStarDict::SettingsDialog ) , qstardict-0.12.9.orig/qstardict/translations/qstardict-cs_CZ.qm0000644000175000017500000002141611023552141023255 0ustar alexalex]uy)^$GrTH5 ;f*%@*0}+++<+~u+~J+Lb:Ys[ %b(eGD1  u T 7G  ]$  jE K*I ) . *7q oC U lw t  Ϧ  Ws=ؐ^pw33g) 2j?lL9;|ϗY~;7.MS.8 g! =mCL   ]_ ? aQ e `  t *( 5nT :n T$ leA  ;  ,< @ G? Gn RV e4D e4D> w  s wd Ge #:4 wD ybYoY rG0sN~V.iY%%QStarDict::SettingsDialogBQStarDict::CSSEditIQStarDict::CSSEditUQStarDict::CSSEdit NahoruUpQStarDict::SettingsDialognoQStarDict::SettingsDialogptQStarDict::CSSEditAltAltQStarDict::SettingsDialogWinWinQStarDict::SettingsDialogyesQStarDict::SettingsDialogsek secQStarDict::SettingsDialog
    QStarDict::SettingsDialogBoldQStarDict::CSSEditDoluDownQStarDict::SettingsDialogFontQStarDict::CSSEditInfoQStarDict::SettingsDialogNameQStarDict::SettingsDialogSizeQStarDict::CSSEditZa jakou dobu se zavYe okno s pYekladem potom co kurzor opust vbr$Timeout before hide after mouse overQStarDict::SettingsDialog&Soubor&FileQStarDict::MainWindow&Npovda&HelpQStarDict::MainWindowPlugin: %1
    QStarDict::SettingsDialog &Konec&QuitQStarDict::MainWindow &Konec&QuitQStarDict::TrayIcon&Vyhledvat&ScanQStarDict::MainWindow&Vyhledvat&ScanQStarDict::TrayIconVymazatClearQStarDict::MainWindow ChybaErrorQStarDict::DictWidget ShiftShiftQStarDict::SettingsDialogTitleQStarDict::SettingsDialogdisabledQStarDict::TrayIcon!Show information about dictionaryQStarDict::SettingsDialog#Pronounce words using this command:QStarDict::SettingsDialog'Can search similar words: %1
    QStarDict::SettingsDialogDZobrazit pouze pYi stistku klvesyShow only if modifier pressedQStarDict::SettingsDialogVyslovitPronounce the wordQStarDict::SettingsDialog BackgroundQStarDict::CSSEditInstant searchQStarDict::SettingsDialog$&Ulo~it do souboru &Save to fileQStarDict::DictWidget*& aplikaci QStarDict&AboutQStarDict::MainWindowPlovouc okno Popup windowQStarDict::SettingsDialog1QStarDict %1 - Qt version of StarDict
    QStarDict::MainWindowSlovnky DictionariesQStarDict::SettingsDialogInformation about %1 pluginQStarDict::SettingsDialogDictionary nameQStarDict::SettingsDialog&Nastaven QStarDictQStarDict SettingsQStarDict::SettingsDialogText files (*.txt)QStarDict::DictWidgetGo to &previous translationQStarDict::DictWidgetDescription: %1QStarDict::SettingsDialogShow information about pluginQStarDict::SettingsDialog8Vymazat pole pro vyhledvnClear the search boxQStarDict::MainWindowMove upQStarDict::SettingsDialog TranscriptionQStarDict::SettingsDialog Ctrl+QCtrl+QQStarDict::MainWindow ConfigureQStarDict::SettingsDialogItalicQStarDict::CSSEditPluginQStarDict::SettingsDialogVyhledatSearchQStarDict::MainWindowCopyright (C) 2007Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a>pCopyright (C) 2007 Alexander Rodin http://qstardict.ylsoftware.comQStarDict::MainWindowAuthor: %1
    QStarDict::SettingsDialogWords count: %1
    QStarDict::SettingsDialog#000000QStarDict::CSSEdit SytostOpacityQStarDict::SettingsDialog!Information about dictionary "%1"QStarDict::SettingsDialog Show infoQStarDict::SettingsDialog &verzi Qt About &QtQStarDict::MainWindow Vzhled ApperanceQStarDict::SettingsDialogPluginsQStarDict::SettingsDialogPreviewQStarDict::CSSEditSelect elementQStarDict::CSSEdit ExplanationQStarDict::SettingsDialogName: %1
    QStarDict::SettingsDialogAll translationQStarDict::SettingsDialog AbbreviationQStarDict::SettingsDialogCannot save translation as %1QStarDict::DictWidgetGlobal settingsQStarDict::SettingsDialog>Zobrazit pokud se slovo nenajdeShow if word not foundQStarDict::SettingsDialog%1 - QStarDict%1 - QStarDictQStarDict::MainWindowQStarDict: scanning is %1QStarDict::TrayIcon Select fontQStarDict::CSSEdit The word %1 is not found.QStarDict::DictBrowserControlControlQStarDict::SettingsDialogQStarDict QStarDictQStarDict::MainWindowQStarDict QStarDictQStarDict::TrayIcon UnderlineQStarDict::CSSEditPrin&t translationQStarDict::DictWidgetFuzzy query Fuzzy queryQStarDict::MainWindowVyhledat vbrScan selectionQStarDict::SettingsDialogSeznam slov Words listQStarDict::MainWindowEnter cmd for the speaching program.
    If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process.QStarDict::SettingsDialogConfigure pluginQStarDict::SettingsDialogChovnBehaviorQStarDict::SettingsDialog ForegroundQStarDict::CSSEditElementQStarDict::CSSEdit(O aplikaci QStarDictAbout QStarDictQStarDict::MainWindowenabledQStarDict::TrayIconEnabledQStarDict::SettingsDialogunknownQStarDict::SettingsDialog(&Nastaven QStarDict&Configure QStarDictQStarDict::MainWindow(&Nastaven QStarDict&Configure QStarDictQStarDict::TrayIcon Move downQStarDict::SettingsDialogAuthors: %1
    QStarDict::SettingsDialog&Nastaven &SettingsQStarDict::MainWindowVchoz aYka Default widthQStarDict::SettingsDialogExampleQStarDict::SettingsDialogVchoz vakaDefault heightQStarDict::SettingsDialog Speak &wordQStarDict::DictWidgetHTML files (*.html, *.htm)QStarDict::DictWidgetNeschovvat Don't hideQStarDict::SettingsDialogClick to select colorQStarDict::CSSEditSelect font sizeQStarDict::CSSEditGo to &next translationQStarDict::DictWidgetUlo~it pYekladSave translationQStarDict::DictWidgetVersion: %1
    QStarDict::SettingsDialog!$qstardict-0.12.9.orig/qstardict/translations/qstardict-zh_TW.ts0000644000175000017500000005157011023552141023324 0ustar alexalex QStarDict::CSSEdit Preview 預覽 Element 元素 Foreground 前景 Background 背景 Select element 選取元素 Click to select color 點選色彩 #000000 #000000 Font 字型 Size 大小 Select font 選取字型 Select font size 選取字型大小 pt pt Bold 粗體 B B Italic 斜體 I I Underline 底線 U U QStarDict::DictBrowser The word <b>%1</b> is not found. 找不到單字 <b>%1</b> QStarDict::DictWidget Save translation 儲存翻譯 HTML files (*.html, *.htm) HTML檔案(*.html, *.htm) Text files (*.txt) 文字檔 Error 錯誤 Cannot save translation as %1 無法將翻譯儲存為 %1 Go to &previous translation 前一個翻譯 (&p) Go to &next translation 後一個翻譯 (&n) &Save to file 儲存到檔案(&S) Speak &word 讀出單字 (&w) Prin&t translation 列印翻譯(&t) QStarDict::MainWindow About QStarDict 關於 QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> Copyright (C) 2007 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> 版權 (C) 2007 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict QStarDict %1 - QStarDict %1 - QStarDict Clear the search box 清除搜尋框 Clear 清除 Fuzzy query 模糊查詢 Search 搜尋 Words list 字彙清單 &File 檔案(&F) &Help 說明(&H) &Settings &設定 &Quit 離開(&Q) Ctrl+Q Ctrl+Q &About 關於(&A) About &Qt 關於 Qt &Configure QStarDict 設定 QStarDict(&C) &Scan 取詞(&S) QStarDict::SettingsDialog Enabled 啟用 Name 名稱 Plugin 外掛程式 Information about dictionary "%1" 字典"%1" 的資訊 <b>Name:</b> %1<br> <b>字典名稱:</b> %1<br> <b>Plugin:</b> %1<br> <b>外掛程式:</b> %1<br> unknown 未知 <b>Description:</b> %1 <b>說明:</b> %1 Information about %1 plugin 關於外掛程式 %1 的資訊 <b>Version:</b> %1<br> <b>版本:</b> %1<br> <b>Authors:</b> %1<br> <b>作者:</b> %1<br> <br> <b>Can search similar words:</b> %1<br> <b>可以搜尋相似單字:</b> %1<br> yes no QStarDict Settings QStarDict 設定 Show information about dictionary 顯示字典資訊 Global settings 全域設定 Instant search 即時搜尋 Pronounce words using this command: 使用如下指令發音 Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Dictionaries 字典 Move up 上移 Up Move down 下移 Down Show info 顯示資訊 Plugins 外掛程式 Show information about plugin 顯示外掛程式資訊 Info 資訊 Configure plugin 設定外掛程式 Configure 設定 Popup window 快顯視窗 Behavior 行為 Pronounce the word 單字發音 Timeout before hide after mouse over 滑鼠懸停隱藏逾時 Don't hide 不隱藏 sec Show only if modifier pressed 顯示,僅當按下 Alt Alt Control Control Shift Shift Win Win Scan selection 選取區取詞 Show if word not found 當未找到字時顯示 Apperance 外觀 Opacity 不透明度 % % Default width 預設寬度 Default height 預設高度 <b>Author:</b> %1<br> <b>作者:</b> %1<br> <b>Words count:</b> %1<br> <b>單字數:</b> %1<br> All translation 所有的翻譯 Dictionary name 字典名稱 Title 標題 Explanation Abbreviation 縮寫 Example 範例 Transcription QStarDict::TrayIcon QStarDict QStarDict &Scan 取詞(&S) &Configure QStarDict 設定 QStarDict(&C) &Quit 離開(&Q) QStarDict: scanning is %1 enabled disabled qstardict-0.12.9.orig/qstardict/translations/qstardict-de_DE.ts0000644000175000017500000005304111023552141023224 0ustar alexalex QStarDict::CSSEdit Preview Vorschau Element Element Foreground Vordergrund Background Hintergrund Select element Element wählen Click to select color Klicken zur Farbauswahl #000000 #000000 Font Schriftart Size Größe Select font Schriftart wählen Select font size Schriftgröße wählen pt pt Bold Fett B B Italic Kursiv I I Underline Unterstrichen U U QStarDict::DictBrowser The word <b>%1</b> is not found. Das Wort <b>%1</b> wurde nicht gefunden. QStarDict::DictWidget Save translation Übersetzung speichern HTML files (*.html, *.htm) HTML-Dateien (*.html, *.htm) Text files (*.txt) Textdateien (*.txt) Error Fehler Cannot save translation as %1 Kann Übersetzung nicht als %1 speichern Go to &previous translation Gehe zur &nächsten Übersetzung Go to &next translation Gehe zur &vorherigen Übersetzung &Save to file In &Datei speichern Speak &word &Wort aussprechen Prin&t translation Übersetzung &drucken QStarDict::MainWindow About QStarDict Über QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> <b>QStarDict %1 </b> - Qt-Version von StarDict<br> Copyright (C) 2007 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> Copyright (C) 2007Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict QStarDict %1 - QStarDict %1 - QStarDict Clear the search box Das Suchfeld leeren Clear Löschen Fuzzy query Ungenaue Suche Search Suche Words list Wörterliste &File &Datei &Help &Hilfe &Settings &Einstellungen &Quit &Beenden Ctrl+Q Strg+Q &About Über Q&StarDict About &Qt Über &Qt &Configure QStarDict QStarDict &konfigurieren &Scan &Scannen QStarDict::SettingsDialog Enabled Aktiviert Name Name Plugin Plugin Information about dictionary "%1" Informationen zum Wörterbuch "%1" <b>Name:</b> %1<br> <b>Name:</b> %1<br> <b>Plugin:</b> %1<br> <b>Plugin:</b> %1<br> unknown unbekannt <b>Description:</b> %1 <b>Beschreibung:</b> %1 Information about %1 plugin Informationen zum Plugin "%1" <b>Version:</b> %1<br> <b>Version:</b> %1<br> <b>Authors:</b> %1<br> <b>Autoren:</b> %1<br> <br> <br> <b>Can search similar words:</b> %1<br> <b>Kann ähnliche Wörter suchen:</b> %1<br> yes ja no nein QStarDict Settings QStarDicts Einstellungen Show information about dictionary Informationen zum Wörterbuch anzeigen Global settings Globale Einstellungen Instant search Sofortsuche Pronounce words using this command: Folgendes Kommando zur Aussprache verwenden: Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Geben Sie das Kommando für das Ausspracheprogramm ein.<br>Falls das Kommando "%s" enthält, wird dies durch das Wort ersetzt, andernfalls wird das Wort auf die stdin des Sprachprozesses geschrieben. Dictionaries Wörterbücher Move up Nach oben Up Auf Move down Nach unten Down Ab Show info Informationen anzeigen Plugins Plugins Show information about plugin Informationen zum Plugin anzeigen Info Info Configure plugin Plugin konfigurieren Configure Konfigurieren Popup window Popup-Fenster Behavior Verhalten Pronounce the word Spreche das Wort Timeout before hide after mouse over Zeitdauer bis zum Verschwinden nach Mouse Over Don't hide Nicht verstecken sec Sek. Show only if modifier pressed Nur zeigen falls Taste gedrückt Alt Alt Control Strg Shift Umschalt Win Win Scan selection Auswahl scannen Show if word not found Anzeigen falls Wort nicht gefunden Apperance Erscheinungsbild Opacity Opazität % % Default width Standardbreite Default height Standardhöhe <b>Author:</b> %1<br> <b>Autor:</b> %1<br> <b>Words count:</b> %1<br> <b>Enthaltene Wörter:</b> %1<br> All translation Alle Übersetzungen Dictionary name Wörterbuchname Title Titel Explanation Erläuterung Abbreviation Abkürzung Example Beispiel Transcription Abschrift QStarDict::TrayIcon QStarDict QStarDict &Scan &Scannen &Configure QStarDict QStarDict &konfigurieren &Quit &Beenden QStarDict: scanning is %1 QStarDict: Scannen ist %1 enabled aktiviert disabled deaktiviert qstardict-0.12.9.orig/qstardict/translations/qstardict-zh_CN.qm0000644000175000017500000002136711023552141023262 0ustar alexalexu(aeGD=1 u C7G  $  ZjE *I ) V. 7q C SU lw  + fϦ  sF=zؐ^w+33sg 2?OlL;ϗ?qY~;7.S.(8o g! =mC O  ] ?8 aQr e  e t *( 5n. :nk T$ le   ) ,<^ @ G G RVE e4D~ e4D w8 s s w GeU #:4 w bYoYr 0sNNV.iM%%QStarDict::SettingsDialogBBQStarDict::CSSEditIIQStarDict::CSSEditUUQStarDict::CSSEditN UpQStarDict::SettingsDialogT&noQStarDict::SettingsDialogptptQStarDict::CSSEditAltAltQStarDict::SettingsDialogWinWinQStarDict::SettingsDialogf/yesQStarDict::SettingsDialog y secQStarDict::SettingsDialog
    QStarDict::SettingsDialogOSBoldQStarDict::CSSEditN DownQStarDict::SettingsDialog[WOSFontQStarDict::CSSEditO`oInfoQStarDict::SettingsDialogT yNameQStarDict::SettingsDialogY'\SizeQStarDict::CSSEdit h`P\ύe$Timeout before hide after mouse overQStarDict::SettingsDialog eN(&F)&FileQStarDict::MainWindow ^.R(&H)&HelpQStarDict::MainWindow"<b>cN</b> %1<br>Plugin: %1
    QStarDict::SettingsDialog y_(&Q)&QuitQStarDict::MainWindow y_(&Q)&QuitQStarDict::TrayIcon S֋(&S)&ScanQStarDict::MainWindow S֋(&S)&ScanQStarDict::TrayIconndClearQStarDict::MainWindowErrorQStarDict::DictWidget ShiftShiftQStarDict::SettingsDialoghTitleQStarDict::SettingsDialogdisabledQStarDict::TrayIcon f>y:[WQxO`o!Show information about dictionaryQStarDict::SettingsDialogOu(YN T}NSї#Pronounce words using this command:QStarDict::SettingsDialog.<b>SNd}"vO %1<br>'Can search similar words: %1
    QStarDict::SettingsDialogf>y: N_Sc N Show only if modifier pressedQStarDict::SettingsDialogSUSїPronounce the wordQStarDict::SettingsDialogfo BackgroundQStarDict::CSSEditSsdInstant searchQStarDict::SettingsDialogO[XR0eN(&S) &Save to fileQStarDict::DictWidget QsN(&A)&AboutQStarDict::MainWindow_9QzS Popup windowQStarDict::SettingsDialog1QStarDict %1 - Qt version of StarDict
    QStarDict::MainWindow[WQx DictionariesQStarDict::SettingsDialogQsNcN %1 vO`oInformation about %1 pluginQStarDict::SettingsDialog[WQxT yDictionary nameQStarDict::SettingsDialogQStarDict nQStarDict SettingsQStarDict::SettingsDialogeg,eNText files (*.txt)QStarDict::DictWidgetRM_RMN (&p)Go to &previous translationQStarDict::DictWidget<b>cϏ</b> %1Description: %1QStarDict::SettingsDialog f>y:cNO`oShow information about pluginQStarDict::SettingsDialog ndd}"hFClear the search boxQStarDict::MainWindowN yMove upQStarDict::SettingsDialog TranscriptionQStarDict::SettingsDialog Ctrl+QCtrl+QQStarDict::MainWindow[ ConfigureQStarDict::SettingsDialogeOSItalicQStarDict::CSSEditcNPluginQStarDict::SettingsDialogd}"SearchQStarDict::MainWindowrHgC (C) 2007 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a>pCopyright (C) 2007 Alexander Rodin http://qstardict.ylsoftware.comQStarDict::MainWindowAuthor: %1
    QStarDict::SettingsDialogWords count: %1
    QStarDict::SettingsDialog#000000#000000QStarDict::CSSEditN f^OpacityQStarDict::SettingsDialog[WQx"%1" vO`o!Information about dictionary "%1"QStarDict::SettingsDialogf>y:O`o Show infoQStarDict::SettingsDialog QsN Qt About &QtQStarDict::MainWindowY ApperanceQStarDict::SettingsDialogcNPluginsQStarDict::SettingsDialogPreviewQStarDict::CSSEdit bQC} Select elementQStarDict::CSSEdit ExplanationQStarDict::SettingsDialogName: %1
    QStarDict::SettingsDialog b@g vAll translationQStarDict::SettingsDialog)Q AbbreviationQStarDict::SettingsDialogN \O[XN: %1Cannot save translation as %1QStarDict::DictWidgetQh\@nGlobal settingsQStarDict::SettingsDialog_Sg*b~R0ef>y:Show if word not foundQStarDict::SettingsDialog%1 - QStarDict%1 - QStarDictQStarDict::MainWindowQStarDict: scanning is %1QStarDict::TrayIcon b[WOS Select fontQStarDict::CSSEdit b~N R0SU <b>%1</b>  The word %1 is not found.QStarDict::DictBrowserControlControlQStarDict::SettingsDialogQStarDict QStarDictQStarDict::MainWindowQStarDict QStarDictQStarDict::TrayIconN R~ UnderlineQStarDict::CSSEdit(t)Prin&t translationQStarDict::DictWidgetj!|g Fuzzy queryQStarDict::MainWindow bS:S֋Scan selectionQStarDict::SettingsDialoglGRh Words listQStarDict::MainWindowEnter cmd for the speaching program.
    If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process.QStarDict::SettingsDialog[cNConfigure pluginQStarDict::SettingsDialogLN:BehaviorQStarDict::SettingsDialogRMfo ForegroundQStarDict::CSSEditElementQStarDict::CSSEditQsN QStarDictAbout QStarDictQStarDict::MainWindowenabledQStarDict::TrayIconT/u(EnabledQStarDict::SettingsDialogg*wunknownQStarDict::SettingsDialog n QStarDict(&C)&Configure QStarDictQStarDict::MainWindow n QStarDict(&C)&Configure QStarDictQStarDict::TrayIconN y Move downQStarDict::SettingsDialog"<b>O\</b> %1<br>Authors: %1
    QStarDict::SettingsDialog&n &SettingsQStarDict::MainWindow؋[^ Default widthQStarDict::SettingsDialogO[PExampleQStarDict::SettingsDialog؋^Default heightQStarDict::SettingsDialogQSU (&w) Speak &wordQStarDict::DictWidget*HTMLeN(*.html, *.htm)HTML files (*.html, *.htm)QStarDict::DictWidgetN  Don't hideQStarDict::SettingsDialog pQN bClick to select colorQStarDict::CSSEdit b[WOSY'\Select font sizeQStarDict::CSSEditRM_TN (&n)Go to &next translationQStarDict::DictWidgetO[XSave translationQStarDict::DictWidget"<b>rHg,</b> %1<br>Version: %1
    QStarDict::SettingsDialogqstardict-0.12.9.orig/qstardict/translations/qstardict-ru_RU.qm0000644000175000017500000002650711023552141023316 0ustar alexalex
    QStarDict::SettingsDialog 8@=K9BoldQStarDict::CSSEdit=87DownQStarDict::SettingsDialog (@8DBFontQStarDict::CSSEdit=D>@<0F8OInfoQStarDict::SettingsDialog0720=85NameQStarDict::SettingsDialog  07<5@SizeQStarDict::CSSEditl045@6:0 ?5@54 A:@KB85< ?>A;5 >B2545=8O C:070B5;O <KH8$Timeout before hide after mouse overQStarDict::SettingsDialog &$09;&FileQStarDict::MainWindow&!?@02:0&HelpQStarDict::MainWindow*<b>;038=:</b> %1<br>Plugin: %1
    QStarDict::SettingsDialog &KE>4&QuitQStarDict::MainWindow &KE>4&QuitQStarDict::TrayIcon&!:0=8@>20BL&ScanQStarDict::MainWindow&!:0=8@>20BL&ScanQStarDict::TrayIconG8AB8BLClearQStarDict::MainWindow H81:0ErrorQStarDict::DictWidget ShiftShiftQStarDict::SettingsDialog03>;>2>:TitleQStarDict::SettingsDialog2K:;NG5=>disabledQStarDict::TrayIcon:>:070BL 8=D>@<0F8N > A;>20@5!Show information about dictionaryQStarDict::SettingsDialogN@>87=>A8BL A;>20, 8A?>;L7CO ?@>3@0<<C:#Pronounce words using this command:QStarDict::SettingsDialog^<b>>7<>6=>ABL 8A:0BL ?>E>685 A;>20:</b> %1<br>'Can search similar words: %1
    QStarDict::SettingsDialogb>:07K20BL B>;L:> 5A;8 =060B0 :;028H0-<>48D8:0B>@Show only if modifier pressedQStarDict::SettingsDialog"@>87=>A8BL A;>2>Pronounce the wordQStarDict::SettingsDialog&25B D>=0 BackgroundQStarDict::CSSEdit >8A: ?@8 =01>@5Instant searchQStarDict::SettingsDialog"&!>E@0=8BL 2 D09; &Save to fileQStarDict::DictWidget,& ?@>3@0<<5 QStarDict&AboutQStarDict::MainWindow A?;K20NI55 >:=> Popup windowQStarDict::SettingsDialogn<b>QStarDict %1 </b> - Qt-25@A8O ?@>3@0<<K StarDict<br>1QStarDict %1 - Qt version of StarDict
    QStarDict::MainWindow!;>20@8 DictionariesQStarDict::SettingsDialog.=D>@<0F8O > ?;038=5 %1Information about %1 pluginQStarDict::SettingsDialog 0720=85 A;>20@ODictionary nameQStarDict::SettingsDialog&0AB@>9:8 QStarDictQStarDict SettingsQStarDict::SettingsDialog."5:AB>2K5 D09;K (*.txt)Text files (*.txt)QStarDict::DictWidget>5@59B8 : &?@54K4CI5<C ?5@52>4CGo to &previous translationQStarDict::DictWidget&<b>?8A0=85:</b> %1Description: %1QStarDict::SettingsDialog:>:070BL 8=D>@<0F8N > ?;038=5Show information about pluginQStarDict::SettingsDialog,G8AB8BL AB@>:C ?>8A:0Clear the search boxQStarDict::MainWindow"5@5<5AB8BL 225@EMove upQStarDict::SettingsDialog"@0=A:@8?F8O TranscriptionQStarDict::SettingsDialog Ctrl+QCtrl+QQStarDict::MainWindow0AB@>8BL ConfigureQStarDict::SettingsDialog C@A82ItalicQStarDict::CSSEdit ;038=PluginQStarDict::SettingsDialog >8A:SearchQStarDict::MainWindowCopyright (C) 2007 ;5:A0=4@  >48= <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a>pCopyright (C) 2007 Alexander Rodin http://qstardict.ylsoftware.comQStarDict::MainWindow(<b>2B>@:</b> %1<br>Author: %1
    QStarDict::SettingsDialog<<b>>;8G5AB2> A;>2:</b> %1<br>Words count: %1
    QStarDict::SettingsDialog#000000#000000QStarDict::CSSEdit5?@>7@0G=>ABLOpacityQStarDict::SettingsDialog2=D>@<0F8O > A;>20@5 "%1"!Information about dictionary "%1"QStarDict::SettingsDialog*>:07K20BL 8=D>@<0F8N Show infoQStarDict::SettingsDialog  &181;8>B5:5 Qt About &QtQStarDict::MainWindow=5H=89 284 ApperanceQStarDict::SettingsDialog;038=KPluginsQStarDict::SettingsDialog0@5420@8B5;L=K9 ?@>A<>B@PreviewQStarDict::CSSEdit K15@8B5 M;5<5=BSelect elementQStarDict::CSSEdit>OA=5=85 ExplanationQStarDict::SettingsDialog.<b>0720=85:</b> %1<br>Name: %1
    QStarDict::SettingsDialog5AL ?5@52>4All translationQStarDict::SettingsDialog11@5280BC@0 AbbreviationQStarDict::SettingsDialogF52>7<>6=> A>E@0=8BL ?5@52>4 :0: %1Cannot save translation as %1QStarDict::DictWidget1I85 =0AB@>9:8Global settingsQStarDict::SettingsDialog@>:07K20BL 5A;8 A;>2> =5 =0945=>Show if word not foundQStarDict::SettingsDialog%1 - QStarDict%1 - QStarDictQStarDict::MainWindow4QStarDict: A:0=8@>20=85 %1QStarDict: scanning is %1QStarDict::TrayIconK15@8B5 H@8DB Select fontQStarDict::CSSEdit6!;>2> <b>%1</b> =5 =0945=>. The word %1 is not found.QStarDict::DictBrowserControlControlQStarDict::SettingsDialogQStarDict QStarDictQStarDict::MainWindowQStarDict QStarDictQStarDict::TrayIcon>4G5@:=CBK9 UnderlineQStarDict::CSSEdit&0?5G0B0&BL ?5@52>4Prin&t translationQStarDict::DictWidget5B>G=K9 70?@>A Fuzzy queryQStarDict::MainWindow*!:0=8@>20BL 2K45;5=85Scan selectionQStarDict::SettingsDialog!?8A>: A;>2 Words listQStarDict::MainWindowV2548B5 :><0=4C 4;O 70?CA:0 ?@>3@0<<K.<br>A;8 :><0=40 A>45@68B 2K@065=85 "%s", >=> 1C45B 70<5=5=> =0 A;>2>; 8=0G5 A;>2> 1C45B 70?8A0=> 2 AB0=40@B=K9 ?>B>: 22>40 ?@>F5AA0.Enter cmd for the speaching program.
    If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process.QStarDict::SettingsDialog 0AB@>8BL ?;038=Configure pluginQStarDict::SettingsDialog>2545=85BehaviorQStarDict::SettingsDialog&25B H@8DB0 ForegroundQStarDict::CSSEdit-;5<5=BElementQStarDict::CSSEdit* ?@>3@0<<5 QStarDictAbout QStarDictQStarDict::MainWindow2:;NG5=>enabledQStarDict::TrayIcon:;NG5=EnabledQStarDict::SettingsDialog=58725AB=>unknownQStarDict::SettingsDialog&>=D83C@0F8O&Configure QStarDictQStarDict::MainWindow&>=D83C@0F8O&Configure QStarDictQStarDict::TrayIcon 5@5<5AB8BL 2=87 Move downQStarDict::SettingsDialog*<b>2B>@K:</b> %1<br>Authors: %1
    QStarDict::SettingsDialog&0AB@>9:8 &SettingsQStarDict::MainWindow&(8@8=0 ?> C<>;G0=8N Default widthQStarDict::SettingsDialog2@8<5@ C?>B@51;5=8O A;>20ExampleQStarDict::SettingsDialog&KA>B0 ?> C<>;G0=8NDefault heightQStarDict::SettingsDialog"&@>87=5AB8 A;>2> Speak &wordQStarDict::DictWidget4HTML-D09;K (*.html, *.htm)HTML files (*.html, *.htm)QStarDict::DictWidget5 A:@K20BL Don't hideQStarDict::SettingsDialog:06<8B5 GB>1K 2K1@0BL M;5<5=BClick to select colorQStarDict::CSSEdit,K15@8B5 @07<5@ H@8DB0Select font sizeQStarDict::CSSEdit<5@59B8 : &A;54CNI5<C ?5@52>4CGo to &next translationQStarDict::DictWidget"!>E@0=8BL ?5@52>4Save translationQStarDict::DictWidget*<b>5@A8O:</b> %1<br>Version: %1
    QStarDict::SettingsDialog ) , qstardict-0.12.9.orig/qstardict/translations/qstardict-cs_CZ.ts0000644000175000017500000005404511023552141023272 0ustar alexalex QStarDict::CSSEdit Preview Element Foreground Background Select element Click to select color #000000 Font Size Select font Select font size pt Bold B Italic I Underline U QStarDict::DictBrowser The word <b>%1</b> is not found. QStarDict::DictWidget Save translation Uložit překlad HTML files (*.html, *.htm) Text files (*.txt) Error Chyba Cannot save translation as %1 Go to &previous translation Go to &next translation &Save to file &Uložit do souboru Speak &word Prin&t translation QStarDict::MainWindow About QStarDict O aplikaci QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> Copyright (C) 2007 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> Copyright (C) 2007Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict QStarDict %1 - QStarDict %1 - QStarDict Clear the search box Vymazat pole pro vyhledávání Clear Vymazat Fuzzy query Fuzzy query Search Vyhledat Words list Seznam slov &File &Soubor &Help &Nápověda &Settings &Nastavení &Quit &Konec Ctrl+Q Ctrl+Q &About &О aplikaci QStarDict About &Qt О &verzi Qt &Configure QStarDict &Nastavení QStarDict &Scan &Vyhledávat QStarDict::SettingsDialog Enabled Name Plugin Information about dictionary "%1" <b>Name:</b> %1<br> <b>Plugin:</b> %1<br> unknown <b>Description:</b> %1 Information about %1 plugin <b>Version:</b> %1<br> <b>Authors:</b> %1<br> <br> <b>Can search similar words:</b> %1<br> yes no QStarDict Settings Nastavení QStarDict Show information about dictionary Global settings Instant search Pronounce words using this command: Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Dictionaries Slovníky Move up Up Nahoru Move down Down Dolu Show info Plugins Show information about plugin Info Configure plugin Configure Popup window Plovoucí okno Behavior Chování Pronounce the word Vyslovit Timeout before hide after mouse over Za jakou dobu se zavře okno s překladem potom co kurzor opustí výběr Don't hide Neschovávat sec sek Show only if modifier pressed Zobrazit pouze při stistku klávesy Alt Alt Control Control Shift Shift Win Win Scan selection Vyhledat výběr Show if word not found Zobrazit pokud se slovo nenajde Apperance Vzhled Opacity Sytost % % Default width Výchozí šířka Default height Výchozí výška <b>Author:</b> %1<br> <b>Words count:</b> %1<br> All translation Dictionary name Title Explanation Abbreviation Example Transcription QStarDict::TrayIcon QStarDict QStarDict &Scan &Vyhledávat &Configure QStarDict &Nastavení QStarDict &Quit &Konec QStarDict: scanning is %1 enabled disabled qstardict-0.12.9.orig/qstardict/translations/qstardict-pt_BR.ts0000644000175000017500000005361311023552141023277 0ustar alexalex QStarDict::CSSEdit Preview Element Foreground Background Select element Click to select color #000000 Font Size Select font Select font size pt Bold B Italic I Underline U QStarDict::DictBrowser The word <b>%1</b> is not found. QStarDict::DictWidget Save translation Salvar tradução HTML files (*.html, *.htm) Text files (*.txt) Error Erro Cannot save translation as %1 Go to &previous translation Go to &next translation &Save to file &Salvar para arquivo Speak &word Prin&t translation QStarDict::MainWindow About QStarDict Sobre QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> Copyright (C) 2007 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict %1 - QStarDict Clear the search box Limpar caixa de Busca Clear Limpar Fuzzy query Fuzzy Consulta Search Buscar Words list Lista de Palavras &File &Arquivo &Help &Ajuda &Settings &Configurações &Quit &Sair Ctrl+Q Ctrl+Q &About &Sobre About &Qt Sobre Qt &Configure QStarDict &Configurar QStarDict &Scan &Busca QStarDict::SettingsDialog Enabled Name Plugin Information about dictionary "%1" <b>Name:</b> %1<br> <b>Plugin:</b> %1<br> unknown <b>Description:</b> %1 Information about %1 plugin <b>Version:</b> %1<br> <b>Authors:</b> %1<br> <br> <b>Can search similar words:</b> %1<br> yes no QStarDict Settings Configurações QStarDict Show information about dictionary Global settings Instant search Pronounce words using this command: Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Dictionaries Dicionários Move up Up Cima Move down Down Baixo Show info Plugins Show information about plugin Info Configure plugin Configure Popup window Janela Popup Behavior Comportamento Pronounce the word Pronúciar esta palavra Timeout before hide after mouse over Esperar antes esconder depois de passar o mouse sobre Don't hide Não Esconder sec seg Show only if modifier pressed Mostrar somente com modificador pressionando Alt Alt Control Control Shift Shift Win Win Scan selection Buscar Seleção Show if word not found Mostrar as palavras não encontradas Apperance Aparencia Opacity Opacidade % % Default width Largura padrão Default height Altura Padrão <b>Author:</b> %1<br> <b>Words count:</b> %1<br> All translation Dictionary name Title Explanation Abbreviation Example Transcription QStarDict::TrayIcon QStarDict &Scan &Busca &Configure QStarDict &Configurar QStarDict &Quit &Sair QStarDict: scanning is %1 enabled disabled qstardict-0.12.9.orig/qstardict/dictcore.cpp0000644000175000017500000002113711023552142017501 0ustar alexalex/***************************************************************************** * dictcore.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "dictcore.h" #include #include #include #include #include #include #include #include #include "dictplugin.h" namespace QStarDict { DictCore::DictCore(QObject *parent) : QObject(parent) { loadSettings(); } DictCore::~DictCore() { saveSettings(); foreach (QPluginLoader *loader, m_plugins) { delete loader->instance(); delete loader; } } bool DictCore::isTranslatable(const QString &word) { for (QList::const_iterator i = m_loadedDicts.begin(); i != m_loadedDicts.end(); ++i) { if (! m_plugins.contains(i->plugin())) continue; if (qobject_cast(m_plugins[i->plugin()]->instance())->isTranslatable(i->name(), word)) return true; } return false; } QString DictCore::translate(const QString &word) { QString simplifiedWord = word.simplified(); QString result; for (QList::const_iterator i = m_loadedDicts.begin(); i != m_loadedDicts.end(); ++i) { if (! m_plugins.contains(i->plugin())) continue; DictPlugin *plugin = qobject_cast(m_plugins[i->plugin()]->instance()); if (! plugin->isTranslatable(i->name(), simplifiedWord)) continue; DictPlugin::Translation translation = plugin->translate(i->name(), simplifiedWord); result += "

    \n" "" + translation.dictName() + "
    \n" "" + translation.title() + "
    \n" + translation.translation() + "

    \n"; } return result; } QStringList DictCore::findSimilarWords(const QString &word) { QString simplifiedWord = word.simplified(); QStringList result; for (QList::const_iterator i = m_loadedDicts.begin(); i != m_loadedDicts.end(); ++i) { if (! m_plugins.contains(i->plugin())) continue; DictPlugin *plugin = qobject_cast(m_plugins[i->plugin()]->instance()); if (! plugin->features().testFlag(DictPlugin::SearchSimilar)) continue; QStringList similar = plugin->findSimilarWords(i->name(), simplifiedWord); for (QStringList::const_iterator j = similar.begin(); j != similar.end(); ++j) if (! result.contains(*j, Qt::CaseSensitive)) result << *j; } return result; } QStringList DictCore::availablePlugins() const { QStringList result; #ifdef Q_OS_UNIX QFileInfoList files = QDir(QSTARDICT_PLUGINS_DIR).entryInfoList(QStringList("lib*.so"), QDir::Files | QDir::NoDotAndDotDot); for (QFileInfoList::const_iterator i = files.begin(); i != files.end(); ++i) result << i->fileName().mid(3, i->fileName().length() - 6); #elif defined Q_OS_WIN QFileInfoList files = QDir(QSTARDICT_PLUGINS_DIR).entryInfoList(QStringList("*0.dll"), QDir::Files | QDir::NoDotAndDotDot); for (QFileInfoList::const_iterator i = files.begin(); i != files.end(); ++i) result << i->fileName().left(i->fileName().length() - 5); #else #error "Function DictCore::availablePlugins() is not implemented on this platform" #endif return result; } void DictCore::setLoadedPlugins(const QStringList &loadedPlugins) { for (QHash ::iterator i = m_plugins.begin(); i != m_plugins.end(); ++i) { delete (*i)->instance(); delete *i; } m_plugins.clear(); for (QStringList::const_iterator i = loadedPlugins.begin(); i != loadedPlugins.end(); ++i) { #ifdef Q_OS_UNIX QString pluginFilename = static_cast(QSTARDICT_PLUGINS_DIR) + "/" "lib" + *i + ".so"; #elif defined Q_OS_WIN // TODO QString pluginFilename = static_cast(QSTARDICT_PLUGINS_DIR) + "/" + *i + "0.dll"; #else #error "Function DictCore::setLoadedPlugins(const QStringList &loadedPlugins) is not available on this platform" #endif QPluginLoader *plugin = new QPluginLoader(pluginFilename); if (! plugin->load()) { qWarning() << plugin->errorString(); delete plugin; continue; } m_plugins[*i] = plugin; } } QList DictCore::availableDicts() const { QList result; for (QHash::const_iterator i = m_plugins.begin(); i != m_plugins.end(); ++i) { DictPlugin *plugin = qobject_cast((*i)->instance()); QStringList dicts = plugin->availableDicts(); for (QStringList::const_iterator j = dicts.begin(); j != dicts.end(); ++j) result << Dictionary(i.key(), *j); } return result; } void DictCore::setLoadedDicts(const QList &loadedDicts) { QHash dicts; for (QList::const_iterator i = loadedDicts.begin(); i != loadedDicts.end(); ++i) dicts[i->plugin()] << i->name(); for (QHash::const_iterator i = dicts.begin(); i != dicts.end(); ++i) { if (! m_plugins.contains(i.key())) continue; DictPlugin *plugin = qobject_cast(m_plugins[i.key()]->instance()); plugin->setLoadedDicts(*i); dicts[i.key()] = plugin->loadedDicts(); } m_loadedDicts.clear(); for (QList::const_iterator i = loadedDicts.begin(); i != loadedDicts.end(); ++i) if (dicts.contains(i->plugin()) && dicts[i->plugin()].contains(i->name())) m_loadedDicts << *i; } void DictCore::saveSettings() { QSettings config; config.setValue("DictCore/loadedPlugins", loadedPlugins()); QStringList rawDictsList; for (QList::const_iterator i = m_loadedDicts.begin(); i != m_loadedDicts.end(); ++i) rawDictsList << i->plugin() << i->name(); config.setValue("DictCore/loadedDicts", rawDictsList); } void DictCore::loadSettings() { QSettings config; setLoadedPlugins(config.value("DictCore/loadedPlugins", availablePlugins()).toStringList()); QStringList rawDictsList = config.value("DictCore/loadedDicts").toStringList(); if (rawDictsList.isEmpty()) setLoadedDicts(availableDicts()); else { QList dicts; for (QStringList::const_iterator i = rawDictsList.begin(); i != rawDictsList.end(); i += 2) dicts << Dictionary(*i, *(i + 1)); setLoadedDicts(dicts); } } void DictCore::reloadDicts() { QList loaded; for (QHash::const_iterator i = m_plugins.begin(); i != m_plugins.end(); ++i) { DictPlugin *plugin = qobject_cast((*i)->instance()); plugin->setLoadedDicts(plugin->loadedDicts()); QStringList loadedNames = plugin->loadedDicts(); for (QStringList::const_iterator j = loadedNames.begin(); j != loadedNames.end(); ++j) loaded << Dictionary(i.key(), *j); } QList oldLoaded = m_loadedDicts; m_loadedDicts.clear(); for (QList::iterator i = oldLoaded.begin(); i != oldLoaded.end(); ++i) if (loaded.contains(*i)) m_loadedDicts << *i; } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-0.12.9.orig/qstardict/resizablepopup.h0000644000175000017500000000710311023552142020413 0ustar alexalex/***************************************************************************** * resizablepopup.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef RESIZABLEPOPUP_H #define RESIZABLEPOPUP_H #include class QEvent; class QMouseEvent; class QTimerEvent; namespace QStarDict { /** * The ResizablePopup widget is a resizable top-level window * without decorations. */ class ResizablePopup: public QFrame { Q_OBJECT public: /** * Construct a ResizablePopup widget. */ ResizablePopup(QWidget *parent = 0); /** * Return timeout before hiding after mouse leaving. */ int timeoutBeforeHide() const { return m_timeoutBeforeHide; } /** * Return a default size of new-shown popup. */ const QSize& defaultSize() const { return m_defaultSize; } public slots: /** * Set timeout before hiding after mouse leaving. */ void setTimeoutBeforeHide(int timeoutBeforeHide) { m_timeoutBeforeHide = timeoutBeforeHide; } /** * Set default size of new-shown popup. */ void setDefaultSize(const QSize &defaultSize) { m_defaultSize = defaultSize; } /** * Show popup under mouse cursor. */ void popup(); protected: void enterEvent(QEvent*); void leaveEvent(QEvent*); void mouseMoveEvent(QMouseEvent*); void mousePressEvent(QMouseEvent*); void mouseReleaseEvent(QMouseEvent*); void mouseDoubleClickEvent(QMouseEvent*); void timerEvent(QTimerEvent*); bool event(QEvent *event); private: void stopResize(); void doResize(); enum ResizeDirection { None, Top, Bottom, Left, Right, TopLeft, TopRight, BottomLeft, BottomRight }; QPoint m_oldCursorPos; bool m_isMoving; QSize m_defaultSize; ResizeDirection m_resizeDirection; int m_timeoutBeforeHide; int m_timerCloseId; int m_timerResizeId; bool m_isPopuped; }; } #endif // RESIZABLEPOPUP_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-0.12.9.orig/qstardict/keyboard.cpp0000644000175000017500000000552011023552142017503 0ustar alexalex/***************************************************************************** * keyboard.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "keyboard.h" #ifdef Q_WS_X11 #include #include #include namespace { const unsigned mAlt = 0010; const unsigned mCtrl = 0004; const unsigned mShift = 0001; const unsigned mWin = 0100; } namespace QStarDict { Qt::KeyboardModifiers Keyboard::activeModifiers() { XkbStateRec state; Qt::KeyboardModifiers result; XkbGetState(QX11Info::display(), XkbUseCoreKbd, &state); if (state.base_mods & mAlt) result |= Qt::AltModifier; if (state.base_mods & mCtrl) result |= Qt::ControlModifier; if (state.base_mods & mShift) result |= Qt::ShiftModifier; if (state.base_mods & mWin) result |= Qt::MetaModifier; return result; } } // namespace #elif defined(Q_WS_WIN) // Q_WS_X11 #include #include namespace QStarDict { Qt::KeyboardModifiers Keyboard::activeModifiers() { Qt::KeyboardModifiers result; if (GetAsyncKeyState(VK_MENU) & 0x8000) result |= Qt::AltModifier; if (GetAsyncKeyState(VK_CONTROL) & 0x8000) result |= Qt::ControlModifier; if (GetAsyncKeyState(VK_SHIFT) & 0x8000) result |= Qt::ShiftModifier; if ((GetAsyncKeyState(VK_LWIN) & 0x8000) || (GetAsyncKeyState(VK_RWIN) & 0x8000)) result |= Qt::MetaModifier; return result; } } // namespace #endif // Q_WS_WIN // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-0.12.9.orig/qstardict/pixmaps/0000755000175000017500000000000011023552371016662 5ustar alexalexqstardict-0.12.9.orig/qstardict/pixmaps/go-next.png0000644000175000017500000001411311023552141020744 0ustar alexalexPNG  IHDR>abKGD pHYs B(xtIME  CIDATx]}p~w%c˲ r8Ƙ4@˄HIf92)Ifd^.pMʑP^M1 $@`oc˲$[_G+J2>3;˫ hРA 4hРA 4hРAm۶Eƾ7xá6 ֭[yBH! ;:B e˖ ^J,.tttތ~J7?l6f0^~=֯_b 5p8J<ϖM:U! BV+V+z=z=011e Ӽ}'5GfjbttQQQtl`Y^,F,?ڱcG& ^xL&cƍ˲8N->߹sgq,^td2:::044׋ TTT̙3q8Xjw/4A,_eY\ nT8o~}"q:^wii鑖fx122;|StttG?Bliٱc8w+vax嗱`A&DܹW?pfrrrj ==>;/Xbqq.]3 qeogCeYl6̛7OV!?6l~34x<}i`cɒ%˗~x000Ʉ͛7S"L0K@٬6:: ͆7"-- mmm`Yk{^t:ׇ<[/^fB|Bβ2͛Osfppڵp\ `{/XիW}"!!lp8UuNiN,, ǣ uwwׯǏ~#)9׻eٳO<&M,Xv2_drӃtlذ}Bb !***⊋9s0Cʪ^TTJiM N'o %%/_˲ RJ!Uҿ-//?zԩa`eY\.T-ICSS.]z cr?w4 0̬{m^^ .E(Aww7bccq]wNPJy0bIYYّSN4"dddT?2ܸqeeeEGGN0\,}UUɦ^ ȑa||===BUUV+bq^iii> @9x<˲;W@GTYYYZQQq١ -- JQXXN rJʖӀT HLL… o xLLLڵk0Lf!+++6mP__j#RRR| 11K, ) ,ˢ0Lv85!Ը\ UUUnll-7gp .]M“ Rpj @B+!@MMB^ދiU4ë:a] {PPزeK؄=Xh9+W~wu;3aS5,'/XRgpڜ>&8 bxxk֬ABB:;;mUrn͚5 'OjSz /Վ㋉!, UR[R344:$%%a֭V3!O?Y_#{wq/=Nl&4˲(..=߹<)@)ڵk1::Q)p_uuʵkU>ڵk9^iiiصk>cYկn/u èg=%҂`4zjtvvQ['{=1k4_qCA||<|)6>Jo:W_#ϮspDGG.\;x<ߚq܎j.33ĭqqq(++C{{b.篡96yϠǡ. հX,j5J;))fݺuG?>6NX5wJ$9gM.PSԉ.xww7=bJ5]ǵ޽{ [j:;;U^rjlR +3ꫯBtww&a`MMMbQQf]]]ժ}}|fVCBjjjn̈ ^ʟtL9 5 4Q둛|)8gϞGf$ zߏsɆcrYA5:+8o%AJJ >sqgW_[[kR ۭQ w$(}%T?'ʕ+hmmEii)nXg- y#eĪT_ /Ԑ}oߪ oll 'ODFFA ÜxwqGn ºupeE>X8̀UTˑ,XST%;v?&ts`<%t^d JMnA܅ׯ "=^G-tj{ xC”'!7Ph^c||Affk^os=Jff?=cŋcŊ (=@箖]YtXh0>>/HHLLibS҇}`ٲeW,tDGpJA9r ,Y^ݎ/"J_~e˗#))3J={~6 ;;7BJJ5L@IV^G)EZZL&N'FGGڊQY}fee!'' ڇQ]vC&ҥKWJO _OVk!0L?><oh/~ƢqqqR%!={|-[$^>E _?jC0ܟArr2t:<óޛ!^U-[E"6QJ?3AG*^;b5JKlqϟ? V)q8\`y!GH4H RJ EZZ/_D"$gH=E|!،ia sp%qXHR$}Jy0 +V ;;Yʓ'7!@ή ل qbs$Cr@崐\ZݟY VǣFcccu @i#<|c"a9RAmt K~=@@5? ௬\DzVL&|p86A)ݽo߾W|a! eHU(J=91A{$''cʕٳgd)۷e:ON"\@8@v?Pqb<,X/_r}O߿|CM!M)NJш",ӧOO) SJxw J0 gl=, :}ɝ#WDHkþ6:J`ٌWz~-pR:ENH$ iiiꫯ 0ؤ?l6#!!O>eRV έ$W Rȭ bbbzjU_rXj(X `N?~az/Hr OʙCO|.\.l˲>b'h4>h۟8 y@-ş:7^!Ʉ媍,?g0PZZ ݎcǎ駟:trUXd  ϕxBAAZ[[ N^gK0 J|%NߔR`޼yBXJ?y7ܳ"<Js(//G{{;.\ 70̣d6n_y`/x`Y1<<<ϡR#B a-0>x^0 ß礔>wf{y .^ \;^,69!u:݃l.4`DJg+q{^a|G|RNġCs2vӸ,?2={S180 ħ~ֈs^T$z>vM:9'/b@JB ,8N߿7nf=ҽk#BH~4#Vn(((@]]Cu:w鶋(@jHZRo*//u+ÇDB牨<0$Tjㅽ>::8y$Ν;7%yѣ#Qa(߻a2bۢ9r" tQ\Ozv\X~=, yX,!XN+X@P֏qdff"77 T q;vAD0"zݛp?ݎ* ⭷޺#߮C#@SN7nđ#G&\O8 &LnlFTTf=**cǎmwe,/zwhjj_B~t:с  t: 8paF)O8q=ܦa 'E||< &&k֬no^q@^/QyB]˗/l6#>>~!z}ER6mZЁd?Jr̄Na7444@CDc^n}}E{dz!y~}l?~MMܑ>{:X~v."l#?2 /_5G8sO*˲&{^M4hРA 4hРA 4hРA9!+(IENDB`qstardict-0.12.9.orig/qstardict/pixmaps/qstardict.ico0000644000175000017500000004107611023552141021357 0ustar alexalex@@ (B(@   !"####"!    %*/358;>@ABCDEFGHHIIIJJIIIHHGFEDCBA@>;853/*%   $*<    =&e5e6e6e6c6c6b5b5b5b5b5b5b5c5e7e7e7e7f7f7e7e7e7e8f8e8e8e8f9g9f9f9f9f9`62h0*$  r  U6FGFGHHHHHHHIIIJJJJJJJKJJKLLLLLLMMMNyE"  """&&& ###X9HJIJJJJJJJJKKKLLLLLLLMNMNNNNNNOOPPPP ''',,,%%%((([=KKKLLLLLLLLNMNNNNNOOOPPPPPPPQRRRRRRS,,,333+++###  ...^@LNLNNNNNOOOPPPPPPPQQQRRRRRSRSTTTTTTU111:::000(((%%%$$$444`CNOOPPPPPPPPQRRRRRRSTRTTTTTTUUVVVVVVW_ .555@@@666,,,'''(((888cFPQQQRRRRRRRSTRTTTTUUUVVVVVWWWXXXXYXX^.999FFF<<<111!!!***+++>>>!fHRRTRRTTTTTTUUUUVVVVWWWXXXXYYXZZZZ[[[`-:::JJJ???444$$$+++,,,@@@"fJTTTTUUUUVVVVVWWXXXXXZXYYYZ[[[\[\\\\]b!-999JJJ>>>444%%%))),,,???"dHUVVVVVWVWXWXXXXYZYZZZZ[[\\\\\\^]^^^^d'-777III>>>333&&&(((***>>> bHVVXXWXXXXYYYZZZZ[[[\\\\]]\^^^^___```b.-666III>>>333&&&&&&***=== aGXXYYYYZZZZZZ[\\\\]\]^]^^^^_``````abbd4-444HHH===222'''&&&(((;;;_EZYZZZ[[[\\\\\]]]^^^^^__````a`abbbbccd8- 222GGG===222'''&&&(((:::^D[Z[\[\\\\]]^^^^^_`_`````baabbbcdddddf=. 111GGG===222(((&&&'''999]D\\\\\Z~WXYYZZZZZ[[YW`abbbbbcdddffddffgA. 000FFF<<<222(((###&&&888\C]]]^^RV~[bcdcddehhfffgggE0 ...FFF<<<222'''$$$%%%777[B^^^^_WBlNxNq[{NyNyT~i|\eedfjjfgggghhK5 ,,,EEE<<<222((($$$$$$666YA^____```V]bbbcc\,f,fdfjjffffggghQ6+++DDD;;;111'''######444Y@_``````aV^bbbcccc^g0iileeefgffffW6***BBB:::000&&&""""""333V>___`````V]abbbbbbb_rcdddegeeefe]6(((AAA:::000&&&"""!!!222S=^^^^____T]`aaaabbbb\acegddddeec6&&&@@@:::000&&&""" 111R;]^^^^^^^T\`````aaaabLx^egcccddddi6%%%???888///&&&!!! 000P:\]]]]^^^T[___``````b e`fbbbbccccp6###>>>999///&&& ///O9\\\\\]]]SZ^^^____``oa`abbbbbbbv6"""===888///&&& ...N8[[[\\\\\RZ^^^^^^^_ki_X``aaabba|6!!!<<<777...%%% ---M6ZZZ[[[[\RZ\]]]]^^fn^^xT``````aa7 :::777...%%% ,,,L5YZZZZZZZQY\\\\\]`s^^bqT___`````7:::666...%%% +++J4XYYYYZZZPX[[[\\\ra\_jxS^^^b____7888666---$$$ ***H2XXXXXYYYPXZZZ[[kg\]k\V]^^b^^^_7666555,,,$$$ )))E0WWWXXXXXOXZZZZaqZ[j\W[\]`^]^^^7444444+++### '''B.VVVWWWWXNWYYYZv\Zj]ZT\\\\b\\]]]8222222***""" %%%=+VVVVVVVWNVXXXndYg_ZZQwV[[_^\\\\\9000000)))!!!###:(TUUUUVVVMVWW_sXccXXTXZZb[Z[[[[:///...((( """8'TTTTTUUU~LUVVw[^gWXTzTYY\`ZZZZZZ:,,,---&&& 6&SSSTTTTT~LUVflZlVVRv&\XXXbYYYYZZZ:***+++$$$3$RRRSSSST~KTVzWnUO>i!XWWW[`XXXXYYY:(((***###1"RRRRRJazrrxrruh QVVVVbXWWXXXXX@&&&(((""". QQQQR~HĿ@i OUUUVVYbVVVWWWWXB###&&&  ,PPPPPN|O~Q~Q~Q~QRogZ~P ~OJNTTTTTTTUcXUVVVVVVVB !!!%%% *OOPPPPPPPQQ^jRRRRRRSSSTTTVdTTUUUUVVVD ### (NNNOOOOPPPPvQQQQRRRRRRRSScXTTTTTTUUUE !!!  %NNNNNNNOOOcQPPPPQQQQRRRRUhRSSSSTTTTTF    "MMMMNNNNNPTOOOPPPPPPQQQQcZRRRRRSSSSTF  LLLLMMMMNvpNNNNOOOOPPPPPTjQQQRRRRRRRSF  KKLLLLLLnQMNNNNNNNOOOOPe\PPPPQQQRRRRG JJKKKKLdoLLLMMMMNNNNNNTmOOPPPPPPPQQQHJJJJJJ\NLLLLLLLMMMMNNh]NNNOOOOPPPPPUH  IIIIJTnJJKKKKLLLLLLMUqNNNNNNNNOOOOPP H  HHHHN`LJJJJJJKKKKLLLl\LMMMMNNNNNNNONL    GHHJXlIIIIJJJJJJJKKZrLLLLLLMMMMNNNNPL   GGGccJHHHHIIIIJJJJKt\KKKKLLLLLLLMMMNM  FFvrHjGGGHHHHHHHIIIatJJJJJKKKKLLLLLLL&N  FiFxGFFGGGGGHHHHHQ{YIIIJJJJJJJKKKKLK,N  ^Ha`FFFFFFFGGGGGJvoHHHHIIIIJJJJJJJPY0O Lĩ\^NæOXTTSRQN}L{JzJyHyGwDv>}:>s=p;o9n7l4k4i2h/g.f,e,d*c'`&_$\rMN'P###SSSZZZZZZZZZ[[[\\\\\\```\b_ZwhYwhVufXvgXvgXvgYvgWtfXxhXxhYxhYxhZxjZyjZxiZxi[|l\|l]|m^}n_}n_~n^|n_}naq`pcrdsdsdsdsdsfvgu9hOL!\$YBW~fT a&\:2cE_$`'bjjj~~~zyyywssstm`* b-\4?oKy]Jx\HwZGxZDvWCuVBtVAsT@qS@oR?nQ>pQ,_@,aA,`A)]>(]='[;%X8$V7"U6$W7M1bqstardict-0.12.9.orig/qstardict/pixmaps/view-refresh.png0000644000175000017500000000570411023552141021777 0ustar alexalexPNG  IHDR>asRGBbKGD pHYs B(xtIME '`' DIDATx{pTǿs7 |t2*u /% &VU'>ZjtfF#% X1yAŠ؁+I6{w'sf'9;sY@h4Fh4Fh4Fh4&^ac}XoO[P %J-x,o-SW&0ZqBVB8l i J! ?*!&GY`5Y$4q#_BB%do. Jiq$ * @9PTc$$%Dt7*ւ(l2~u/`\) IIeOZ<ߪo\@S z1[ {A*Q_MGPTc$%%prm wwV`-|Ӗ,4WrgG^4@1eD*ȳz u?իTZ&%]^YI*7mIX`\QMJW_Hv?P]8`1$$*A jw'7t2][Ь`miFЬ[}cUl[6d%fqiǺ܃Zvw֤;(wݣǦG{-!vƍiK{aXy*@{$V<LP{DTb-eUy<zv+35p Hl+T@!ď  Sl;{sfOȸURHgBP {o+b" Zr9sK H~>Gpwﱮ]2-(p*gK R c^dzbZb*DIpӐ$>HbQFIsfp0܃خ=fkr_Uf["z #4_!jcޞ1mOi5/J^gn%01E |տ'+2Y xk({qZvZ gO RT:.^0'M h]3`@aI'y, w)hBJ|2s<;5)0/zOF I{#ϫ$ a/_!! QX6e—5`RRmGca`,e\̱VA]=u\fXb'dzMdZNwV*2s2-CHl %;&yJvL"1}(َ1QߞRz #h3_I 7ط*C;:~Q,jn ά | wpC]}і.XZWVO,+e.Ƙ@ʨz[Qq;n3wPPaӭ⇏Yli^5/mrU qd؎9≋p'/@]E(3X?aװD+fl'p%)/®*>X= x/R׳isDЌōZBY$SZRcxP 9psBpU$@>6~V>{_X޲ƫq5 Yd{Ca 3CFCc{Od7 `g8(03@fr)CF8'ĕ csي=@h"Ѫ@;ܥ qo} qUuoLRbk"Д{0W<ƌo%2iE7DSMM] bFW]ya۪#b\.`9@6Er7ߵL]f@ `Ǯ7}\͕t!Qgon 'x{ߘA%Ӈۃ{|W#Vh[?rjGz:RzvfD*pJ$}i^/c -{Cx-8j`2g)%a'.o1ט dltM@> C_,鎕>us IC(Q2r:V~4w_'VHIS5]jFh4Fh4a%ܶſkX'lp)aM](C}nQXp-a>i0 CAQ!-x@`JġG2p hb<V#"){pœ<7bf!`CiDKbF`Ю<@4?O"Æ7)ng(SB`H+NEʐk0"M%IENDB`qstardict-0.12.9.orig/qstardict/pixmaps/arrow-up.png0000644000175000017500000002273711023552141021152 0ustar alexalexPNG  IHDR>abKGD pHYs B(xtIME #0{ IDATx}y|Twd YLքl$Aqik}}DZlmVP}hEDdIH l a dg{ds;K h~O̹9s\`@d@d@d@d@d@d@d@*B_vedX.d pm:D:@@N3_|`X4 =DGlve+@^a4FjqxÈtbxZ8ԛPwZצ ߊ"p1TWWCdLz8tǶm%_Iu)xoYXXr#7w<"""ӺCt_ǎUT-a z@֭[_ȟ4ic7y³P 'L@~n.t:|y3W*#GiQ AtmRWIfrwDgyy(χ^j۽jտ&/~vTTEѣmu`l[wi`1DQKdd.IN՚xԐ=wt Պ Om×l @i&ig؏Q Q(VZ'{1^p&PֻCƈ4KJ*Q;lz} %rKq8!"<4ƺȜ~|ǘnH\7S3za^ʳΥ06t(n@gg[# >1M5@/*Mbt:#Zk㪮zLj=x/9{P[[+[y?+iw3?%@'#IPi^]܃: /@M%DQ*@ь)cH!C0up>|\mog=p\Z Pq̜Νq.^āa`pEDEF"2*S9/su(խֻܜd8III0]LdBN8(3h 3za>m*t:gz9]z ti1z%oK[Z 1<"7'|S "#{uכr+ lRH8X*EDHHkp8<#Фc:u[3f02(]S :ӦLAhhP p(\zFVMM JKJ "ͅfѣGqtM7wI5|q< Z8;qq-U!G,H !..΍FtT{<0ZwWdn>{챞tq\t wE'dW` OڗIR!΃=BCCQWW"s` ,񪭷L͜MD%6AWP}T3Y!Rp^[?aa!QUU˗.aРAQ,ITaZhkkaq6UUUHKOKod2 /ǩqh\ `,@]]J 5ksU8qK |Y!tIfbcp:ApgYǥU;w'R'rsrq{]4e*%)%wC|'T]EEhǩSp%#44Lp摇Q=2=G 2R@fVcǪo 7"JAr:D]w˗{tYUk4ܸ=p|‚UwUɓ'z]N>˗d vp/F6 nQ@ 92GvIvS{:-\b}"BHHW2wo!mI7447h.s1;F)Sڵk8r2d |+q/3&3>tzzBE"(A+U;}S`xF?JѰC:&kfWaF3Jnǽ܃wUSҕ/pe$ NhxEe:$cq-- "*}m*%=uF#GfTKTfٜ6(-)n3y/]xz1.^gHHHhmky!@x ?Gef>K@Tӆ CxXs/Ǖ+5HLL`PLF)HA.5$K{aZ1iDXq]wSx 1)z}'mKgʱg#,}а0E@k/~!nJg (/+CgG'rssn*J?99ىҒR1MEQ`2"$$' =TpQ:Qxn~11ѽI^7/ͣ+ X,+/CGGg˫^vhot:̜9+V{ II/@ ,z~,VR >|#( `Z%t~S]KKE:%zN++GG{ƍWBXh(nbK/a1hhGYi),Nxr \0bIp_{hxx&]J狂g8n`0d ^|Wm:;-_^6= k֬陫W^~GB[[JKJi]6wV߁ Lp7Nr.Q^ops( Qbj21:%d vKtzAwmjކ#3 222چҽ]J^QG}* &}95?1 ^ 3J6L,tjhkmCƈ }u-_%22kVFFb_Y9,N {;`4zhXU5k8G- 7V vsv 8I%fChimEzz:֭[hwƚk0|p`_~جVG\2,.uM!$]l؟?̀'^J1MMMhjnf@垣ul8| ZZZ6l^[111]$&&k_]Æ`<kaVHpbăp ysyL%!!6vYM0mv4Ͱڬ ;Kh%z<%8Q8dzurTVTIذ~=իW׬ ׬~c\z5KHH됔&s8!@d %6449V]CA ({PC N4aZ=:oΑp8PYQ&3ƍHJJ :lތFEe F'`B>*+*0{l޼9MLLkk!!! 8{u}='͆fX,LivĹyUYcPfq\{: Gl6#!!ol|)))AK~6fCBBrrɄdttvl6㳝;Q}:b|3ܸqMf$&&v$Kz!NJ@ Ǿ}bhTTv-hkoCNDA@ձhl4cp`acʁض<1c"+;'_NCl7:'۶aCqKJJ ֭]874DkFN!8.@3EDd$M 錈3c8\Lʘǫ؀Ac͆+Wbٳڊh"etMBDd܂zlh :::iSO-HJL jjz,tgI(/+>@^r(\׫|!@E>u _Gzzz?w/O 1cF+.c$qhl4he%ك"1el߾ hinAl\,l6{Rf-߫MFNHx$] UU~"#"a1"(?|!>} &yy6'_N mx ` 5̙3.۲Kt]Z{rKU2I( ЏG#ganh@tT70j䨠th}}=Ν$degh2 u5 `0 dجVfD AaҤIv466 UQ̹O kYiY` :h]]=gЀH=jtP߹s'()-.$caQ.v}M1,:ycbk׮n:zNTT~ ̍fX, "N֕MGޒ*ѺP{>w7n@XX֯{ AzAw@D>YхY}*z99οfD ƍիګ8u,{fbn,qfaƩlgϡzLF֯_:JlذGcc#Ð5> qq|P^gttԌ:|8{=0Ɛzƌ|NO%/^g4k("f3؏FHRRrrr07a1x`}/3#>+S5  ]%՚ɈWWAaaa@o޲wpa ddcD<3HmTpY792yy0 8ٳg{QhAAV&/]Fjmܼ;9^yV´iV,Y}6 qBxxJgx/P$ߑNfl.\EOHIIAFF>x::ڑ6D.9ya4zĩ.陥WP0rԁzQQQwUU'`0i$ת{ l!-mF }^ݎֵY3^ٌ E^^W^y<&"::J.%8ڷ{瞿E 3@Ta4 8r0‘|~kjj2!{|6UG'<4plРACcC#jkk(=F z-U\ǩG4P0ߵs(@aA@GU<|g9,4F (+/Cjj*Fft;CC>5o&3?> PY5m& ))ٜ %8u$ jrO裏s"vJʚ6 ]>7GO'Gx;"<!!z444bΝ5jw#>ӧO#$$cƍŰaCŎkMI{ǯ4搓y$$& 2" 8>CaС~س-c cǍСC* g7,~^?$9mcb@ˋ zΠ|<.^h]ΦMc1OHZvorw :oN Ƚ*\/=zfzӧOǼy`X1#GgOOz{~%K҂fx䗏\_g@2kk6Z'h^ph^i]v}eӥXqZ1i"ޅpmvW;~h_mF>Һ2O to: ҫ5^n3Zf.)wCo4}Q? uD~JZWuobx )2_MA㪴?}{0 _W;j2~CgroȡƯՌϭbwv&z_.CZiK\Aʰdi7MD=NAܗ,-w]z¦M'=d̞Ua^fd1[N`IDAT!0OT#$b ^'[f=³F\0o] <_Ҭ'1<+_r._xwT9ei3!ki]sʴޗSr߫j. `ؗ=zi]vڗzKfՀ ~TiJfi~"[mO|KE J[6@>UGϟ?~d钻_4k{޼EyR>wgמ3*%Uݎyk7+<]0o>/7{מ3=/''.x$vAkvG!\ڬW-Wkj|uJ˕uwMTvu4r @s^RwSRZdȌr_6чEEo "NT-J42VQd gNmt{X :Qc7ՎS)||Q#y0Cr/N*Ntu֑Ar>֑̂@x cԫ}W@> abKGD pHYs B(xtIME #ueIDATxy|T?gl-/@½j(jKKҨ(ѠnJ}lV}zQKIHEKmݰ^/hd ̙ٗ?9wf2Y! ^̜{w6|A(W$4M_HQ(EQvHE$yj~{O6 Sg˖-f_#bI( 4MaxYR}V{.!^I |Fqom4MiQ DP b 7www/KNi`6UСK?yHRO0fXwݘ;wpر/uSJ89:o7 馛 "?  " /kjj0gٳg;B*8'5BBÁK< $EeY> KN|EXj@*'pHr&uqF/_w*RNhA;`#)58mٲe ìw l2<3l/X4>PtF]]wݺr엒i < e-A$)9/5 rXo00m4P%W"~_~9)ޑ tEh4p@1ݵ`u7%T*ՏhCaq\brEQdqb2,+"qҥK(._Ft4M˭zzz@$4 j5XE&… ֭w2 a ,M/`Y( Q8@4Hq%K~Zӟt_(zaSO=5K(VWWG7VfGN<qZB筷ުfτa 8n"Qb|_.H_җf1q(˲2Nr˻[OsP<!n_͇?m4TVVB1f/"(B6{ ÿ~4qG#y@)GIiܹse$I ZEQ ,"g5Vv߹s'y"l`P[[+z$I)^/8,˂$ɫN>|555SR=" 84AB$IFccl6ihZ,+8UgΜ+FzPjLJ%÷X,( eYT*$?\,YTUU!H$Ii`ީӧO_cS.bx%`4M'teй\NNJ.K>͋8$ ʕ+oʂOCɰ95@Xp R.n<"|=R3S5|+=J޽gjϗR \j$VV˲իWdn^ʞb׮]S4 &͇; *za@>`ڴii^x!4 XEGG>ۺe˖zӹ2v==>$pXFQT:ddaHC@:_YYsy$ ͛7Od;7mT_UU2J,A@FS8"PŽF@{~ Br9x^fq4777oٲeR`fye6% a 4m|Ϗ,˾`STmfrP2񊀦ix<t:̙3q|;_y ֭7 +Y%dpAV BWjQEQB%RtrZdF`D"AٳO=ԱիW/k֬YV]qֆT*%?R@`X@ŷʠQW^fIٳqeyٳGWPTPT{U;tM(d2hiimېJR@4FcB׿Cz߮=~SZR!!Lע@Ţ p /Ш>xYR8r̙`2DƓJJ3r\V7|3>#9rD,2f2hIR7UQH*h1㼋@+(B_Owqtr]vfhK(p\0@OOOAasIG T*px<O:a9kZ8o&hzw_ wɣ! (jdrn(/Bb  (jFAgg'bv;, 2 2 8I2C. ^(By]&Z(G{O+.7 8Nz twwy}@:rrVe$I$)p΃nח DQGۉ\)Z'rS0luuu7NMUW]V ߏ /GZՂyyz8H3f@MM BRIAFt:Hqq'\:I"`9+k*RPo~?u @ @:ø$F͆l:(>d(ӽ{0_|;o=S+՛@E @uu5~?4 b, R)8jXւz"ݟUV=2l[A^󯮮~=h%^El6#LeYh4hZh4$ 7-$v؁\. _ݽ{wP9 ߿-K4ӧOG<GEEt:Z-t:F#z=f3)A*_Rի7oE_}1f|'Auu5,Z,Ʉh4 N^͆cǎҚ 7@2,#/=pz뭗 7_0~?v;x/$IرcgǃX,&G0"hooǶmېN<+2]i,X~ρ@4|J^Nx< Nd<߻n4h4*)A.EuF@ V 0$iNd2Z6E__2 ,<'E񤈠6ly!QYjѱ:G`PtH$ DdߏhZX,TUUn| g2"H&x7uV$RWO_P ;@>9DQD4E:.X ---Jbb%HG6HD8Ν;f_!~yqOK@@ 555lt\ $IyR)wEWWװ˻_;s23 a HP:aPTNZF&A*B?bذߗ/x$^zd8t뭷~3UA.C$A0D$J] f:.:AlEV:x"}s n}7 ~(BGG BB H/7(fyEq-/6448C~@ P3zFsNjxƍVXAL-y~ [hjjәwgšuuu&2O3L>O555?C8grg0|˧ ~^(˲I7455}pG32̟?_7tg9\gCDg̘5\QQ$-ϸPWW| $I~eÆ ?N3zKuue𕦦g)q?AfӦMq}&1c&w9C pM,54O6|>|>nCM8e$O0ze$IسgT᪦8ˍN'@ss3[u:݄=?<_?瘝6){zxp8F   4~e4}չ>xvt:駟j_Ֆӂ/5^_2rc;yMMMVVh4 eT۷ogeep:OvpȞ҂Ç<%cK|h\TWI?6t8Z hnn.oTB!~4E,<)J-TQ˖-[lZW:a9"?$x?Q<-JwfhiV/1 cp8.b1b1D"b1r *H$|pjmlfCUU@[[ZZZdœ5 DBx<Zz 2 `WVV6UUUUXVȝhoo/W*U| H$dDիW?`+/^eպbhV]]](U*.=?ىd2X,&ef͚dew=h4n6uV&I9_D/{x\8gk֬Xdj[-b{{{/y~~/ 9?Ȳk׮}BAUF,ZmV = r &yV× >%IG׮];d2l6ϪD"Enq/R;v옜ПJenݺ((osFh6a2މj??CGGRH$B.ޫ>hb4MfFQN4/O&q^}SДQuuu4[&b6A4ߏX,QaXp8G >2^ttt LH$q_%Kp7_hޭF \.Wjfjak"PqWpf^ގT*qoذAARF̟?Va0 F{ޟ7mt{(z& zzzdy p *8NyaEQ; f555?]t/Z_d2Aр(W <H w566(ΝK;=:B"Θ1=Яǻ?՞vfytvvbpp0>6mjT0Y .|złl6綾^5;}. yL`D$C¦?*\,\IĝFGg͚dVd6< T*,A:.?888_}7j~`0hEQ _ɬK/ݢRd2Ad2yv/5Ͳl4Zp\'z`&kR2qGZ.-GYM)pXp=ܳsH_VTg2D6G :1ڤ$G;2x\c9y'E8`B}N%UZIx0s޽E'*xh;Q6etqX(t:9x%6 hii/zѢE+JJ [nfEC@UP XP덓s +VЩT**4L&8gΜ_WWD|HԂ n8'L"ƻ^QDRPO߆Rd[&.^|ş~G?x< V̙3ܻ|)ছnl6s(N ab]]]cJDRyaDQ޾} q|aabKGD pHYs B(xtIME #E< IDATx}yx}$@RD|R_qj׶Vnnw[{u44i64&Ol8%Qmqb[-ڭ[)IM@̷ `%{*CiG:`:5k@$v[pPY(3>Bg>v#&[l`[`xM8f7S*$v; @`EqAHBN/#Y'b7 2򲹒Rt ?s 8=K3 !t䄙iO@.>0ˉ@?v|C%&<T^5/ϡ@&Sޓ)0'7f:L@089t9"Ț̫&K o [o&m*/JÂA>c`s; o](1=GLɒ)5P~4;'28bK2g/="z~`髊 WIJYw?L+;%e.zϓ\Y"!fSnUAK 'Kk~6B UG#]`?' 07b׉G )Gk@$8  Hlgc(Εhj|6f^sBY @bfNx y?ʕV@JP@юfb!ee:X'Eƀk1 Y̾tȈ']w+6DҊ&mpu.)&7khʠ_֙ `1L|%w|d0h#e} Ÿ֝'fQk`n4xW_ 5*7n@uG 5ÿy>2u@yaM!=G,, dԶ{7EoNC :1{ٕ>kB(vf8>g0R]=ug1^ov:a@d*^JZca:ƦfS.DUSѧg?\^4mUtXtPtϽ A~|c<׏?0( {b(qMߟ>dL@e-`-Y)D4JJ`ٲdhL>&*byy~؊O]ukӈu;&0>Q5;hۉZq؁d*nj@]wCi47_ `w4xfWr#TyF#˵oR~-]nmT_ukJ}&0y޾fVǝ2p<~x>K)?e5OJND[T P[)Ɍ~(Cwjuu(ٰCB=8X*Ӑh1#Gs |0l&>Tlg.!81Skܐ k@m la#J+M\Uu.R~Pxgކ-E*UJ([:Rd%F< "DM\ D%H pY,4_7;\:>8qT-̀O`;~l `:АV@ɍ7b/8vӘCbLwc~-qKԤ |0UV}^Xd]._=!Ѽvk@EEPY|(`ʗPS ?Z;_=VנluTq>Sf_cw&Qx?1O]̸><ڢ*#|3БpUU``2Oc,[[3?\qqLcn0^~|U7&y|.H/`n |0U+A+'1Q@`-CEMMQJ8==3.#jtT5*R{g +{4c<>/Ĕb{1rA: V*ޏ/j0ajY.IsT[;7e`lnI8aF?嬁/#sCI݇twyo5(wNtd |) |1M7Cc#bf>tͪksN InyT ja2`^ԩl/FdCT $EIЛ#'NOѱ@Vwb/<ܣT#"a` Y8d)\ema! յI*{k\ߏvAL ><uU(9"Ѓ}x@Y{[R2TV*L0껾6 P0< U2;:V^vL9 O9mWjnnFǁ(u|0WVI3z!Pp@g*h֑1O +dлkgnI0gQo**aknPl6g#ۖbk= bJ ^vl/.z>EfRQW9/ePc*WlRQAR]xye5C v*AәC;|c%l-j_`-|hKV>n[ 8L1Cu5g$JzLZ>]gJ6l:NwNAl|!+f~Jږ+R^wyq(jy Q&._4͞VlM(["ܙC%P9Բ.|xhNR+4 B!6dH<d;"r;g[$j v@r::رޮ\`HO`v:s.l)>& "|f3H@ 7fz*.C٥0idk{htb67iAM11VƑ.lmIZR獛ZL}i <e"(٘}/ ~zwiokq&^g( SߩHLaJ_"2i-AOi aoi}~؞%XT𛛢v\c|F BHt37X qJj'' :Uax ;`onT\ [[`u6 aTOFW$x LMBky8ÚT}6&s89  PQ/Z{qS}2߇Ѿ7G`!wuzct_OM_P-y*E5; =67I@CkAYS>zo[RJNX'4V$Ԅ[ Px/q5Z"X?6 azi,\Y*ID~,xгk">/X' rT.R13EEMe RoV? atB Ie('ugTMU(kSޮ.!&y( ֆ:'%MZ\81^ g:`L}&W3Le ^H^ݷTÔ+^|ٶ/O_;aTv߳PŒacDq1k`E1o&J:(vOB8_~o` |^fGSȼ9[kvu/x0A2&HZx_r kuϐT |;3%H~YS=Zܩr$D OXqVl`v|>~e9ddWVe@ {KXƛ RwM$c َD^tJo>ŠIJ/_!DpDq&c0av,8R*Ap#ގ={s~ƍh߷_̠[#+yQCA,X(J2:X:@oRC8$:>/D9!}!q+^~2Lw-& \CqDNqPt泂M5"YrgybP/" a F!䟕 kCǡ_TQ(QH}0Ax\Ct?@p8 8K|߉3Vw" aݲ Lq3>ȅg2dFt6ۢJ6~ZTbBM13<<ɠgAxd! dv\{K"Y,D" !<Υ܊/PZzY2%?js0=4$Tqb+h0>Ppypc}Cq۝w\Q.gKLa 2)ǝ̆ley0F\Ò{"݄gk@r_" jǵyWFYD 'gpcnʼn+> CsG$&oVGIK$8C2Y5=8O$v\pJp\£C]v\/8~D6Ԋ;ӟ.9S.7fJ=Mk udyRܟf@Y)X!rsvxV':I#}Ki0]++ Dj`dlc}.5>g:ޮv\% `5$izJ;}i=}7D]SDY. w_u=۶gܒ`Yl2L {X P6 ΂z  "|~]P-=$?s 'ѳ}x,z妲dFwjD ɖq'F)PHmx+~ _櫹۷5" IpRf…Y#&l.Ui/&\bAd94=ms6z "4;u>=`*;.\ Hnx+>}XT/ z]ִA/UD,F`j@62?@#,:ؔƳ~l1 ɓE KivFL7rݷl8H;NY>;>aF#Ǩضmo˸q`z`PqCq1;夼,VZ؛`mKȣ8S5YW1).JL,c/(@ۿlqo66lu7֫F{;>~deOKZ(,@ҽ}~xsf3V9mޜ[%jikVf;`oZ$ЏL ! az6g<0ӍA$.J/l`=uW$VX[ 4D4\Hnf`0moĤNm/~z8;RPQW~v=9z4dF,egd_J8?NiћK6Ȏs}[|CM SY u7K~a^ r@\O}KI6DunU9'@z&YeS{}Y#.HZq%, <6?sϋkpЅͤ%}N5kIU֜ ) Ӭd @i#%vv ,g྘n5kE[ , كֆYwe/(GUi1L5V 6%fP baxfdZVĪ+" onNNSRh%➹B,b(.Fi%_nu7j#S >_Jʕms}f_r~{s~UzҬ֦ؗ7 0qB \C~n5+qjoE#A ~Le: `P]6@g*ҭf%Pվ"IvgGO?Ao XobBJ;n#4)@`a9<ӲsZV>ABɓT=Do9W`q9v;PRe e q:VRf}8?_L kc}VR?X(K9~ ,||{d, r[@!9#~UTWG89Mj5 ħf8_} ''Ã?況[VKmݛj'Pd?QxM-N,zMh01 f Z| OlcA`ғ|Ūb &߫@K?' 3)? >|c͡6g# EzZ3 OB~?Lf Vv(=U䢿9!Ȗ{FUc\ƌŏ G!4O&r> /l~_ 'q{F01uvW4b>OYW>TsEߑ<?ٻ. or{T@֚/Eu21uDԕ?6 MhbYCK-U֊\&]޵@+?a =U+Jͱ{߱Yu=@|u%6uL؞7`/vvv/>-I/ld׶ρ pUǞzot/l@10Uk׿.,d鷱[n9zm@B-b{=|+ rk2'< j uxo4+q` A\v61^n/A8Pi$abKGD pHYs B(xtIME $'m IDATx}yxUչ}N9$ @ 0ZiVVzUՋPz[;\}ڧ^[qD B" !2yN9{d3$f쇬{ַx/e2^x/eM)u3(K!RA R8bҮZ @3@M Vi̥G??NN `yQ>yEN0Ǖ2^ϻ pJ)Hdk@r-`(aDÇ 03} `#ow@puD l'gc5/?0: ..>v͞}"S=wBc`OڷqxPf/(XI`/l_zxxDEE" 0X,6-CX,BGG'::;с޾>c;>Sڐ:=q`=pQDJO78 )HNNFJR2BB]t\ǥz456j\ΰ{=' )Cg ɨ{iӦ!3#Sf. fܹ8} Ξ^ŲxOyyyKfĘySsb8rź1 * /^@Y ;w"c}{>7f4w瞅b9;wÍu!Oۃ'Q~:<=}c[Pzzz`Zݍ~ڭ7=G;̌ C6oN>=luG_uPXtN=9:Λx,[RXtR{pa477 "5WE!-- !!hljcL>FiI9|PYYɾ/\kPwNHo#5%Etgzkhw$chjj}ŊkW\-EEHKKÜ9qhnnFZZ:8"FH#6&)hjnbqHB8!Y~߿r_l:|OU^p8A\:Ye=. hll'|Պ6nqxhnnFC}=ay) rK dパd̘X]uzW ,94:"BJJ nznglV{.jchhhwfbʕX~%8|Q{"RRSa6+m <ى^Kg̬>uUO%.ODii\K sv9 Kd^3uػgl6nZ = k/DZc؈ #)9.f=H X)GWWG2#3PuU˗'O(|DX驩XP+1U90ܴաx^o<=S`X'+*Pwj/^Da*&!d&%&== 3q/Y3f{ԩ֫YYOer3?9) 8[=YJyew/֢x>[n[+VGԄDFF p"L4 ]Q#ns#`VVUVV Z^"㰨`}"DQ(2&B>ssg;s3!H7r0QD _\ Apmz0åϟc 00!ogvQ\M\m"n 3ixn8V\;#t( `I Dk׮VYs55 r\,^Ղ100 G[S˗1hRL&,Y!!!q!y/^1իWc͚5^W_ŁDDD`e jɡH"Uހ\FS dRѵU^^2Wi \yss좑i 2OR5bd|hcp<>?r1{ǎ -q`L(Iz:2N#aB6!;+ 'U}" Ƅb*`u&Js;ZT/uѣ݇ӫ>wwwFKK fAV,U$N-h gShhl곍٬~HWz?((333(̲Y:IB=ftܘUʼ|~u_x\niA\\2ḡ(2bRᄨ[HJ'0mTwchhH9&spӘ{nZ]+_|Vv6xYJ,2.hYVw^>xG#ӞsUGLzi@HǒQH9 qqqhjjR^¨S00a;;u:ȴDҸS}I"Qy$l6cX|෴=+aaaEX'ڬRduE:Q p;Gt'0fQr?&:&u.pDȪQ]D&jl6 1$8HQ'ρܫGY18QV&wf;ij?JWW|I0&bzF&""#d)dP\mg ͑e$j.G;8(JoI"Ii]`j-$!(8Qv%(O? ZZZSk#|9XS2fHahhH&>8|6[oE)_TzJ|~`CIrhnnFdd$~wž}`60+gp:ܜ`DoC]Įv~U:/MΉy`>K(5auvv1 ""BU#鯥"JG[k+|ӧO+.]‹/ 3d_%JŽq7yy^1G_FKh"n%himAtTcF\ BAAPVZL0L;wDy99cFG[X2+sJRlV{! ˆѩڱd rDA@GGBzxʎqqxב+ "dϞb2y IZRN_ҼXԸ/ى߇Ag|A?ȹ?0!aP ?#l6N xב؋ǟ7m np?5bA "AjFm(8md#+JWjWF#߅8l߶B}]]>H ,aAfŐeVձ?VU^K†~+Uyd9./waTHǷ<8S}}IШkqu%&8@ZͪJt#9vQQ.^& ٳf!<<ucjՍ V\n.A@EIb]),6 6zc~<\:#$=#ĺ;d=+hll;WvTHPy3&%ϝ7(EN {] 8 Nm35\QnL\c25+hjjVyVsXXypڋhwv/HXO;.'k d`p kd2!k,DEGy]qJNNܿ1T *%6ܻ$Sv w y/)m yGYF[k+N9s$Xv-fϞ!>\QǨuWWH>~KވuP 11=܃*07xgf\nlpczS=*| {^$$ȚXw7T+ RSSaA{+1RzYu9~xy V31wt?|1d 1q8Jý' Dpѹ}BPOBRbx.>>=ݸ{QVVWIO"nB:;:Q{3={fLCox׆$H mX9]XI_QQQضm8CM9z }m=k,V#qB¤cFG?*O:n¬qOźfpV7l̜9'ko$XnM>6fNv3݄]H8kiC;ֿ o =F}W#?1CCCݻ `Mș;?сHyp~E8^ ]u3i5)ĺuPRR)1-=h|dE%W@#Zwyh  FD[=0댙3 ł0>?|w //'3uͽ&ὂ=ڝN hhǧ{>kb>{ @TTWҊ<*=iGtr'p /o> ZZZ`ߜ>@ Оߏ=_<ʙ<X0봌i1 ('?O Ŷgx9v"~.źDZuyR.QOpѦ g V6a֘t!!^0߿m-HNIB@@zەk3{/-^2C@\n#G ((sx`LܹsBjj $\QmPo ӱ.ulV`447_Ʉsy||чhkm۷7pi[v|Eppkax"Fi52*!hn~a\i֎ 06/zۧY_sD(S=uaH ǎfjᤤ$mmHtI9=4`QqqG3 IDATPDt'qY0>Y#""&=y8p`?`X0iRư0tKQ>9i8xq>Af@DDPVV~{4{yGΜ=!)9F }m\U\COrDF- aĤD/sx//r@ǰ{L'P  +A(Y0fGtTQqXh!IӃ?0***sf~4sLtÖ-[::@IqIk%ɂ0kXxcX߀hiiŅ.Iֆ*++%K#$$d'}wÆM)x+5fϳYR5,,111hoShnj’%K4IP__\pXG7/;*2Ǘ/_DzJn544o@*4ce={?{hjnBtL4,]10EGڣk'ɓGf X47tu5jkk|rJBgg'xqcsQ+=6Fw޹*{ۘl/UK[[;< Պ+ÍߺO>yq76/&kyםciJ`7yr:rg`tMZOnvaʱ)v<,@+Vx"Μ9! Nӧxv㣛Fs9$xa"zHCUP Xi}ћcu1/XQ|J1ܺaCўm/oK2`Ko~tsXMW^y%E^E؋ёqOYz% /X"`7 y\Aׯ|J>b=Λx"BL\lPE<~J?U%z_|qle}'G7W^=t~4}=GM7}t>[{q*0lU~=SUJΫ<ܶB~b!+\,aMn:vWzb,6jyuMv|&E?/j f$UDk%Ƴwb˥}r+y#ߜFwp7D,3oEP`p9EH?ONA٬/8V`:u@\IA#OC3Vݘ:9=+2"bl3xbXz1OFh C?}~ppzkՕmogCԹ Мpnz .ИD9 P@OH(F +%t9WF@ ݁N^wT~.UEp/ݝy}a@w'\ejpTwбD7׃Z0:zoĿ/x|z4to]}@IENDB`qstardict-0.12.9.orig/qstardict/pixmaps/speaker.png0000644000175000017500000003407711023552141021030 0ustar alexalexPNG  IHDR>asRGBbKGD pHYs B(xtIME6W IDATxw$]~*t r%KfW1p>0N`3|`#cl$YV$[9Kjsɩ{z:V=sTuuUwj%KlѫTU53<|߂ձ:VXcuձ:VXcub?/͒O'(x]m!6 -G5b=|<tQ(SZ0BYiprӣV{@[ w˔}1Ѻlgq_zp-zVk}XQ SNq*op'V# zP 7}`d89a׵fkVUڧ5/ ]^u$xwiut3: f{ @v E#51(1S.mf*䯁Zb8S_к_7E#[ȗtZ]֣ MxB Z_Q薙D}BI󒥂CRs Xic1l dL:ݚ.Nj[JtFk{\:/V8oq~2.Zv(SE1-'k ˙J~-uַ>wU)ʼn6݉iubY00̤a#]E]AEZBٖaia{:6ٴD6];$-Aֲv@p?ѻe;hpo>|*~nN/9xJJǎ%X!h|3 LDax"B]BEE(wN"kh]k%;Fdzm$)_V(\^@[owCgbi:鬿kE޴{I&9;19iyviXc21?@J+T+'Ty[刧Hg3:٧U[n0DSQZɻ ~'0}Kg| u^kJUcىCWOiژ,mtdf`9ވndA۞')GS)Suchg/7!Pߓ_˖3d2*>o[w!bg ;Y_Dgs[nf̑#Ǚuݓ!" „0=5`0,S J{i`O.,̏19v7sQY3cq6PQBx{VUg/kB~O[fgOx_߼0#i e ;\ /a`RIJ<20b/qéLFm[rY$Ր("dNZX=pnWO} ͭ\Gq7a..<{E^~=_aИ$I:!|cд<ѨW'7 !#Jjd)_ؑG8q_( 廙`xL.Bϒ/Z:ei!?p~oE nH> |I)-$}hm\oS3ku {u|TiR(<_kiy Zg\BIX,m{)JrL栔¶,6l:77~[qHw] hfvswOdYi@uO^~K|Pt4 k#?Ήh4J+V 5%OR>|rH; A﨔B,"O`&R*(W*]\ _!,r O_XOψItdE*{SOo?[ 9TՀ}/\R:di!%_L@.:,$O`&N͡X,Q֐RaY&mwgx;AF7^⶯u1n!iX'ǞH{wJ!=U~t&f`EfaϝݧiBoף3[>}{d?6 ZbHREJa6o;_LmއP-DȤvnr'M !:;],5C,.,Ef0+6R~%Y/0PJg)}@z2c8E bû7\rdwts_Z3 EX ˤw n&_{4ywH4B`7h`UJ(H_FD@`@ (UW*P|`3ytjDJ}xR`1l[( Tig\qjؤRF$B]= cRN#B3w,_ j}>%T6* "IkXX:4Xp&O,="lZ!pZ1?@WwgfIuR)' n}m,< l:u!en'A]WbDR2㠵ft&Oo\; "@a'b G@:<G̣tueJy{iDtkuR)mn$SaTP8 AȰk&RaտNw~NJoI$mёD.\rRXwr{Oqc+LAPiǭz 9v7Wkީu=}IҙX* q]raY7>^]R^4/ˊ:}:і"(d kֺi*n Ce,/VrN& S,R:{-pDò:sOw?<}GvCg[AJHƧl&R)6lXK/BOϯZhZ'G4쎶gz4R@%dn6jB%a7yG򋌏O31-BI$|._hzS_}u%}痗k4~]4m\Wއzq{͓O<*u jW&Q\` <\٤J:FG!›-a\)c[6RqFc)aE2!˴LRYn՟Hj_}pݸﻆ5ZMٶkqblڴƎ? zy0N.h% ,ϊdow :T0FZQ,F^A<\Lgoo3ڸR~^ڧ꧷aʦDqt/$v|_@֤4LXn ~;*CszӁ'[b[cJ^C+[]/+n ĺ.6{q[a.xZtL&"[D)@nv6|7=ȣG<!``29pif p,\Uٸ%g߷.bdwgn'1~b|_T)VqݚH^DՇjn*Vm~lT[ AդTdIۓmc1f)J$ L$Hgϡ\Z|qٶ԰{#A O︟g}-Oe\?o* k+z~xp?Q.V$G[Q 0 tD4D47AGu~ G"UA-M9:"h1AGGRykYTw1?scr~t^w/?wD;I`fnhDB_W ۷֣&l޲/m@1vTH@*:L K]ThX9mHT[PZEVJRi S1,FA:=˹TK/[Üuy HWej%|wWkglҁ](2 mEvA星_hD?k`h:? ˇ%BZ֑o6I x*! ǰ-HБDQ-Cu4'Yd:It9y?S-nC;}U<DL``^q(vX;4mwi~ϮvQ9!uiSEѷJFnbȕ?*J-LC֑ܨ3%^_e=fp~9HD4j5gYXRy +J K 5mMgdtuf1aT'a6!wv%)^*$R=)Ukr1:P㰴T8yŧWU^1yd:kx> GozKE͚9sxʕW}I|Hԇ o0$hZkOqBA,`AZ%119JX+wk P{A5TǪi\*/*eXMh"M:aϞ$b Z{aaamZ>ı#ގۀ0 ?_30Ow~'ߵ#Uk X2ZJV?B}.|+~,--Fd%wRuPGcn~=1,+(7a()s;1X܋ʅwm|~> ߴY/s9Rn Yj/MC*myQIhU'FgҝNsb|aI:"?s?eg[7Ue[bin/#q~ߓKW)Ǯ6T*v,txKu{%&'8HXdfvE!"h?ٳs߃tuu3t9z9K:-/+ё`iʩMyk+?_xt4.92,,`dr!T4o(-@Ϛ#3>>lL"1;N,fƠVQ&_ \r1"C"nZ@Tb5$WR)~q c۱ i&6R-QK/ Gsgow pmvk;n |Vb"Y__$i|y[;v $kSuhV#q4mXſ~QOz.s3LL`tdaE-P ZdG-|C Ut+.={rX~c(-X! 9bbMPr/?> {9{n 9!gY\PI4%]B*1*Ӌ~u?>FZmu 4><; fǰcu`-L9h%Dgocڍٶ idp5 eAF#ZϞwLvtlaF#IVxSSX~Ns36tÝP2?Hov!4kf)Ȇ&ϳMuc*=; $覲vJ\`|87n zt#Ҵ))tݒ @/6n $cteR-Dqk_u+fKڧQ*ǏM2f-30E(G^ P}ك$It}Lg?^ KHv|U xm켈c=w-EntLE)KKyS\6G1&A;CGcZ] 5+_3v(W^."Rmf/O}>~Gx_u7ُQ݇R.G#!4oOywT^-0=IDAT3MZ iG ۶H>QHZA875#JJܠ drjRԩJXW&?͛-%e ]] ,. a_}rwD{} wuܫG5PmZ]h"$Bךf=0zt1$s-ͯjFGGʫT%@C4 |]*T7(#ŠAtK~)Mr%OEt@Owx" Ak %? =Uȗ}K}HpԵ;~->e3yrG] þ!PSwJɐN3}Uu?g a@6%DIOA*zCтPəg72p<o!HT*O %z{ J#lcO.]{ջA7U|5{j{d4ٞf<#!e=ر,sssA _gмa:m Ѫ 0T 5Aup0"-L `XIUhPz!5!MLH$Hu"A)X;4řUpق<j'@tfj\K,NnhJNƗY ,|3xt4WI{A+E6ŕqp\S88ㆎ{ԉFHsɅrjK ko-3_`ׁ HHD:s<6C4 KFE\뿀x4"}!]=V#rx#]7B$"yXJ@C&9ͺ{Hپ+JXMVc8^S | cO:8pZ@ire;HēPB>X>^]= 9~8]]$6o]85ˁϋ7$zӻqF1@7 :B&S.ܣ1R7\[AV'Z;u 3 JTn@k8LLqp% Cͭqj։o=}\tޥ;ҍƘm憔Qe+ZbaDJ16v޾~b>9v\:@o%BQ,Nx ~ čTƫ^FBEWazr:2kw?η!'pm{7}u]wJ8{/!P(n.vLN/RVpܚg〆x̦-224iY!t[дj "^GSƚD$@SðP,.399ѵ^FHk-лa:wXo jP6eddHᦈ R(rpߋ^OfGHd/ƩCVJ1uGWjŤkVPGtsJL\Z-:^vm$q24Ll'T Sp§o;NLYDB*I_OD-(%9}W_>rJ"o8>O%#Hw~ҩT# GX6Dt3vsj5^{NzGosIt^[ǩGtlѮo1};æX*VJiNhiTݴE{˖ao퀪"SplCbH+)%#CP^O0 v;|@kVkxӲB9Jiy`i,S*y9 wt ;2ʟJz 4sH֪T|\n{i Pe SS(/dE>|K#$ӉOګZ߈X!Hx9]$fHgA@`ei-#wr;7z]kCh$iy@ӓ:Ⱦ@W6XZJͩF+ۥ|_A7n[Gԃ\$@8C ,Zb5~gM7RX-){ko8ƺ1VT顳C_bnn%z(T bk<"ITu CnqO}. @ڏ AIˌt=˦oI䈧6ݻXq7O}(7|+^ٳn4tju&X#fHto#XRI M^(m<dD5D=PlxX tY..ӕuOM&O碳Bn_#Rr>D,To4On*q(c͖[@k|){1/5MRl۶6%j]('q͜tVNy&oǩXlSN??cSv7P yק\zO|[6*z^7`&J;+cc~#I>Mdڵlܸ;fLg U܅*Fu.Jm;ޅV-P=K9=h$mk5isdj ɗP} :1֪~di"%exDJS):GYf<5Λ'qWo0X2q;ۿo 3M!-/(͇ïu֭ r|nn7Q֯_G<oRHt U= k gn]bY1=Ԋ{qв_l&Bb YY 4brՠVӸTvkXfے.=Uz:+(y]&ӿ@k̉ *>9C?ҫj[Hf;ّddt#o"j35\^ H5I&PPُv#edXvj(UíNV"I+ F{Ij tj?׎jIsb=߆o>>_s瘥]ݛ5ǁO6+Zk:RZuԊ={7^5%@C[j!L,Q9VňTX;l`ud2Chu6rgPr=epsOF Nޫ풚?Z7[b5vkxz[)rSO<鷠1+Z!lmT.cqpg"Dep,fKHb6J|QEeLa8ضIJt}̜`|qx%ǛN~_v[B008@"ܟŅE~>i$ #Լ 20O2іn *g)p1d.y424bMliJ lS#Hr0^mb%,a*LC` 0 7(lZSӒqؽ$VU䏾{N ~w~JsRZyf3d;;RLNLC333 @Kl6==$6j=) A8G+Hүt @WVM$&En,ZDrZDޫO$0 3J*JͲ0;KKK_tqxôynM0xz%Q*1,vmRN?s?QStIsV!c1]4 rIm얊TJ%2JW״,lƴ-Lg}!~r:-R7jNJfAYOhe{]k4J]VoSJd&ڵe}J[S3<|_=0 y!vJ-Za>%ULkZ;ZeuA+95') 充^zcuձ:VXcuձ:VXcuձ:VXcuձ:VXcuձ:VXcuձ:VXo&IENDB`qstardict-0.12.9.orig/qstardict/pixmaps/dialog-warning.png0000644000175000017500000001746311023552141022300 0ustar alexalexPNG  IHDR>asRGBbKGD pHYs B(xtIME4EIDATx}{p}  E" )1nq+G#vJy&M\V7nW&8x&ըv6q#;=c[7Ez8NzQ$%"&b_@qfvb;sTJTJTJT>'x @ْt Ve xz  JJX@@5@%亂M @nq) SMv?6^j|j5< j|a@0 @$ H-Y_~?%۶m[я~tqsssq; 'pl```̙3?O{>߬&`ll,mvڵkP”2u߿NP(sf|N$+p߿NE@Y 5,_~-lvO1\  J~֯_< !h`եK5)ҟJ2IE;I. `N!Hs8cloo7z\E0YjW)hܹsGydD"VWݳKdP< 4 ^'q$ .)D(T NUCCC>`٣b%(U:zA$IyOD8&0:0}"V2-)nǒ%Kq\_bſ.(@w٪_}5۵8GAd D5^vi1(_g(fr˗/oܹsg+Ub"f޽{D9L&M>?>9@9l5.XCPFoe.ؿk׮3l3 'sr^YrXXbE] ַP*.+χ9ei#\,怃#)8',7 YU_ommmR|֟ u ǰnh(@KC@ IRFZ[[ US,f?Q;W,T_(g| H^}>̦~ϧaK X$ID" F B7W dq՛HpD-ʀ\ iWP3X?H_3Ŵ `\J5RW-@,(_$ߛݻwg/˲Ť@/Ys?9b2‘bz/EBl3d/e2vJ>X*3nԊ'O 0*PCs~Og~)]@xS;nA4t `TkQl8X{8Xg1$)ڣٌ}-^˂D+\Ul*ϒـ1ٳ瓌jcMK}fN |Z޶ }{+*"3*@9f~J H8@Y?@ޛ qx3>|T# x/%]) TVVfTCHB21_(x_91㈊Y===oeTN#=l0(0~ sYS@.(@!6~NdI8ho$Q!I$)n+C!"d9FE (jq0VoY>fm۟6:}EG$p {-X㳵*El_+B 5rHYW/Ic>ѰU.PThT?|FW?V@i&jc~,݀(Ŝ$ 2nժU` ܹs5+Wlb?@ :m:hj0-ys3E4Ç~ePo;^dZ[m4r 0`˱ >*X <~ߛH$jwvvjooϰ_1x bTvm0%ۚ &r(|ϙv~w$w^|ՖV@{|?r1Ւl1nHag ]XT/ TS|Tj˖-ږr}wwe]>~1i9nFA _@ f 7}+_7 ~*EQWGʗ>B2!!~+@_hwgEiHkYx{cn7~KWX5ѣ],㿝>G #/He9+OZḯ B c%-={X/~=z HN/RH@G-`>c~7c}f;rA5(tvvfدLd! 7yst,Uf! o%仺g5~u4IRM6e|2Il! q3t%-իW/{Gf9ٳeD"Q-Ioǎ+HKARab|"fY=]NصSO)-g*߯UͰ?Yf7#7*pr%cR3;X,S6x7;Ks)loa?~jhh({2F{B A 4e X.x^Gzx>ŋen>. ?鍟Q]l,wV| Q'OV]~:Vݸqc2o4i) i@ h@ 0*+ hؒ":GGG݂ TEQ_4>裟PXyΊ~V+ Qe|_}`+Bƍ)_YŊKnSV.H:y{XU@19GFF*+ T($Hṫu7y'NpVyA{WZT 9@qIy"Nd`˲D"XfMsTZ^իe###@Dٜ/_p^+/ ܐ ];tWOOg||#3Lskkkzz9g?l8jwjGG g @pewH$Rcbة)Y?y`~|Cu:{Ɏ *2*2>ľ^4T^3Z5dlW'~J*A<6mjQfPدFָ' :SYK?8P4`ZdC#lB%O"DGGG?_ 0 Sϗ`0XD_2~VXj ӣ +@:t萫399rۗ)IzO[Y (@GGGxg7/^BձXOޮV%yVnEꫯ:/^/^Z 7U]HfQ|/iH X,7N1ĄMJZ @0U_| H/~q5kլ%[Tq=ЌU3]ϻpZ4B0>>nig?,Yײ |r^@<3V=?GFF<(V~衇Vvtt \}aO=Cz_o!NBH&Pj3!vd&agoܹsLA__ɤ*꺬?U,-kBni$[~ϟG>^2L#998U :THb 3c\}Bq@jdY[uyOߡullr1k;6_y@ +y-5n !6<o@ ~#p ?ߒx{@R )酝-RfQ.?uݭ4A>*WVVk+**jvoa$ K/%t.UcE㿁:e XL*s8.q\|Æ ӧ˦*O={dV%.MGw]; fJ  `޽U*(?&VhW_}X4Ϟ=f^ӏ86Oy ApI7c˖-/kfaHl8I~'P9 ᴮYR\ IMA pNV 8' P2z@em? S~5ǭwFazc.>k|5Xq.bM e,nݺ,5Z%%FY K_R3@U2-86lД%C: :iKAfua_˪r>-7nlRJmpp,[̛xr.H[KV+`W~D373>477װ3I8|>7%eee|Bsf1RbsNݦQ@-okeBr݆d~"nOWD,@Qk&PO9,p9&n7v{fѸh?EjlsCӕ* ?uf\-Wsf,)oeY&e0H @ڵkue`׋ }گʔ39=?kAVz`bbB@p "=h  q̙Q5Z/^l%P}syB\Fm5tSԶIJpMDD^~F:2q@MMM E ϻ覀P/h4)`K (B8W"˲ds 4[qzR@p8r,_@+'O Q&& J{BB;XyAt~2tAJ8Tٿ>,(PNqǷnJ[n7 "RT! qB\یZ'N\|'< ` e=( PgΜ?׬YT}A($I%1[n=4<<|Q )I_LK|ꓝN'3`V q9}6{:t01h6IW^yedKicx^eZT@PX2~gGz5ZOV@HG"饗^aÆڦ:N UUUhhhȬӫp@`9<=#ݒ$?|'즆F?IܴIڍ%瞻p,}n|饗.0+f T87ݻvZwSSS}"rE$WCǎa?}0Z΅z.u]wSO};쨨(/dnJ(gyΞ=|~~MCeZ4nWVVV|sknmmkjjx<2n+,"Ǔ D&zzz~_^yWI05|_oUpLc剓*Z+NH;SFЩUs:3اu/K=1اu|&2gĤr#J)j)&a>kj-C*T1E凰NRМ~ hDG06yOy/G c@ jI>*٩]VNe~hr1~s^k30gx2$("4(Q :F7$٨1veȱθ5,L-#@Az"&F-~NQ$5tyQ `fA뜙,D鰜ψI@ :ug̙z\wd-d%P HFFr\˸> Dϗ-Ii}|6@(` f`gq雏XͤܬX{4s`Yi9- UjiIENDB`qstardict-0.12.9.orig/qstardict/pixmaps/go-previous.png0000644000175000017500000001432511023552141021647 0ustar alexalexPNG  IHDR>abKGD pHYs B(xtIME )Ke {bIDATx]yp՝^ϩ4-a[ fl .HVlX.CZr8&$@lXB q(W\@B ^–id3w5{fdW55==} 0` 0` 0`1Af<PAoݺ wqU6X3I޾} m<7Ԅpĉ`u lǎg& q=3?d}---hnnFKK ΝZvWQJ;d_?pw~G^L)ZX,X, үM{6b*د(7`! l6jj"  !R00qw/RT!˱rJl6CEvAAPJa`d7JRjR ׯGMM  J)***dڵ ^${DQ|RzZR,Y{/qQjjjpС),t뮻n$%Ji,|J)8Ã> tX, i L1۔R"I"3f`ݺuEǎK+Xx$I  /uI=J)nxp\x,J)BW(E)-dAnEEEx衇PSS> x\v;BД&ڵkK#K(QJ!cX`V^!=zTLd<G"SJ/U5& wy'/^N D8=B)D)[}]]|AB'd93LDĚ5kaLT+VUݍc' W%IQ s:H$DQq [fc3ƈ޷oG}+~Co W c mmmX`N87)߈ =п1~+c{IP__of@,x,ټx<>eIG5ks3w'n[|9-[ۍ'OjV<"IEu-$iclh7|3jkk >/sU?ڵkR#6V\ؿ?Aq'<֮];㸗c7[bU҂N\mz604Q-c^7|3v;߯sW׬cvk8cSÊ+xpA0!/Dsa`~@5Bȕk6qua8z(Μ9lK5L c+W 7t!ؽ{RWRghoo/ B[cNϛb tww+T~*G/b&Gpl=Qt]òRgBȣ{x)~,]zuj[nuwO2"ޮr | yg]-"p E;wT /l5VHR!Z*dv:y9@b ;=X%ح .e әQh(@$ZW JM;0VM(_E)}1֨a+؈" EZ^HmNL>1x67 hkk3͚5qJYPP+W"usԾsiJ3+`HvLI}aÆ1Ɩ[=c +g)}OFZ[~*MlF 6|12m^z)vu΅~dj]!gҵ zA5 ֮]k+--}1V.Ւ/fkݻ5 !S"H'$mِ &d O/I6m4,^Vb\e0mXZTyZwlܸ^JO'NΙ3ؽ{7DQ̹6\I CRQ1lƢE088eX Z!'(!&eeehii#G2T0TΠu~*!V_w<}npsTVVO?UUw0_B!rBA-^_ {ǔ/-}}}>&PQQB.rԩSTkꇞk2OKOP "՞4sJ؅7o!2ȱgWW'0L?>Ν (jՙȐIէ*|ᢋ.œ9sPTTAt:D ,U+SI:xZ%[OQjH$s݉8$tvgdc CXVV磮6 ###x< -3945)j5MU6mڴ(lc'8$! B =طo"455fl6addDOA 4$[ LO?RWjR^:u*/eEW!Y]]aZyF [dgjᙴ!Dy68+0ƶ0j)G&+KF& f$./5sGZUzLQ9Rziy<ݱr.jTo8>$np(Z8E[$͆ S-#z @Z $L-S-b1\Qk (`2@Qd&'8S?$S~r@o$1C&o`?tԷEQ7,d+7nxR~|&KǷT0'])1lĎ0SiISo4vpi?mǡVX >oT5rxVc8jq~'OD0p@ %^(m"TM& `<|>ߨk&!~g>y2/Ȣ(bL&1o<̘1#x9"T )p/L.2=\5IGR+Ujm 3tEk}XZק;-ZT>oBJJJ`Z<^o~4>웄݂  fR;Z YOjlZ%~KkI!=\_IIu$IFyeeehjj̙3a2O3td6$'Q%;!f<#p8k/[[y>LgPK' PG ́dBqq1v;"oe˖vJX,ߏh4 ͆ ̚5 555R{"|VO=Yɩ I5kޓ$駡P8%%%0L(,,ę3gt's1zLXf2ho1U /q"'rT  3gDYYٸz|-^f4^mI#uǜgIpRz!d SޯWYYz(\Z5z&Skj69 {W^aG,Cii)`Za144cdc I79tلy}/  )b1v555GYYyf-@KkUT*_d~ X<#G:uѢEAIDhUzLH.L2GíV+$3( n,[++Fx<(--nϊZ0s9է*7x_L b``ǡc:ތ^6QAS ^466:}(wq_$Iz! Vb1TTT v@`_ȘNz\Ðkߌ3PXXߏA[n}C^y*ǃh4*L>6ެln&+ӾD(,,<($@}k4,We y#"Ymjoo_.###fQUUZl6 +cRhXMWWWQZ#tC L㨫 e#Soc B<ϣ((( R*eOUȩ>2߁Qr:q},CUUDQDqq1dܝtرc^JBvq *ͦOX,=\=E-EZi֬o!]?{z|p8p|Rov-|Kh4iӦvF3jd3֩X^'C.,r B~UTT}MvA^.kkkk|icTWz5, QPPh4m۶!*tN7Gpb?w8_8g$Qy^1}t+TH3}~'{yċ/([kM&x \.<ԄBχoESֹjo㸅b1Ӡ*h4zΘx=3 Rhz-o$ItMMM*/rJg j_=01c~Y|%h4 ͆f $(t}gACl6_ByUE&CЀB!eFRS&~h!4A ;C/ԩSp(//ǜ9s`61<'N@?jkk҂h4sh!13hDvs'f BHo,Cww7`61w\Y4 _zbT7nbΝ{ xRAttt MMMR;CgH0 Ȟ={n2L!0t:QZZV@oo&@MCL0ڵz! ~F3gۋ@ pNuN!]A Kf/(===p87onwiXLj& y؞={X,Ӊp N5` t>DߴX, !dȑ#x}:̙35XpZl):AfǓ :Lg&@eΪYUt+<²ςt' `vg8 wNB@S술wE4MYbkƴC$J6c< zkPB 8c}iꮹ"ͷnvOR2 Px+\)G)o0P\i}eZ0i0Z8^2;iĀpD( <"U:'@05rS&/ ŃQjgiSpvN?:k|he 1Vte4(222M?9-z`Mo *:ZĜǾ4Y}ISh)ȍdH^Qրk(DQgkn9Mͭ!>2jV@8]8&pC AG5*j9q!KVܜWroyy3<toF:" gz99W}W^,kiYWa hqy.ůS8X4 A(/q£tQE+pM F1 ]u0kH[Ҙ -_iָĪ/,6',ggf56 y:K3;+n*0XMX/YPqp-2.W?Cd,f i3=^~:98PA(VFrL\O5_Gm&6{X_ИMج5`-H6G)\Gc26jW\ U #"b7]60 2ja p1?PnsSblzBgрՀ j@ 1`…$6~ 2j% Ȓp@[pjɂTZ^ S602k U|r@[U5j B8fRD`XڧaC]D<11Au!moshd<BD @sX] )K[-CzHZܻ%6G HPmi1dnΎ8󢦰/c}Lp=nqVZ,3[u畤MmI#K# e[lqDAAFە>c&[c&h%ǃFPX`RHÛ\-ii~7Ag*qs̠}oa?}k7x6gTSQ*AbWaa|{STcO:7iq!bL':d_]<@x ۼ`zlQl1f 1IU~[Dhв.D3PVҝ?2KiN'6O6Ø_Yy_.%9nzM9jی/^r)PG}f S{VMI[ Vd:(/pKpů熌صr3VʟdkGA#+Za`G<iS-`" ^ fs*@; ٦Sѵ%q>12~&Bb#CSGzD4;y=68-KBdC H (('3|+z17JmT8 >aBW*-K}$ފm6fsNo燞W}EJg3 W\k<9g 8JW>bQ=h`;Jꃙzdyn3<%mk.sucKNWy ؋N Ɍ#@D)GsJxxނEEJPns7DGB#qPfcb}2CCz'鶉k[It! 7$^?0z]=E"f[/D0F"ͦ^4fB#"UܲjHDWm)̎ӳ]` Lowfd졐+GB)KZW)z7B8E:B$ I=":Na}5z'qRn_訌$#GzJVU\,S/W ( YV)~KءlJYW%w<RVݴ3=5j$[Fj?{UV"S uw*]S!pb"-4 -L_!MH[E().Q11bu\=[ 7]@Us ;*bN5L;7װ)QX]p >}I'oD<7m\f\+7l])QT`> SX,*$>oC㪂U~@prnazK22P}s\6}-׊GJ3(-&ŕzx<-A&ԐgJ[|u7k ӏU(-Y_+)toBOL*qUe(>˩ƌ21) KZmmGZ' (U+\͓lNKќc}?ͺSQog% 5VJ";bKZBD>i ,Gg!6t)@(UzqY ]T&D-mv7ȂOYdwM}jպ*Q1ꥂ_++OB 3#PSE"?Eo} ",4Oh#uw*wL'J\SU =;"v{]_?]4\IENDB`qstardict-0.12.9.orig/qstardict/pixmaps/document-print.png0000644000175000017500000001435311023552141022341 0ustar alexalexPNG  IHDR>asRGBbKGD pHYs B(xtIME 9+ kIDATx]]luݝR4%\+dU ᴁ8p/yK!@G=Ab܇I} 40~HP!C؀ɮ%ϒ>ܙ;3w~%ݽ`fG$swιwc~"dkHj Q)R4p8=ËgV'q Y<ɟh.`h Cp&=4 YW<~GYH~e 0 hD= |?H$T *&z2@nW A_H"($j!(G2P{|BU~0 .^{˲ߛ0"a %A/y4My)AUvtm,pL8/`Y.^u\/3qAo$08vH^Z尾_~:E WY6`މC\rf3H #q/ِr!5fT7+J)*:B@(%t:c\sB OfM ̽`ŶeZөp{$m_p}mo/_X80ϿtX\}~MnjƚV vrT ]]\}̙ߊ@RJjZuӁa{0 peϡj,fWa& B-hŋCt?F.Á.wM`vZe,TUPU_0 \zfsmɨT*xG.w^WLDSTE0 nwmvt:2&VAZ}pKq/ {$@QH1b}"Q-a* WPl[ITe_4!`o LHa1nrqȑRܸqoJ_h iB' y0L&'NW^۷q{;#)@ {W L"c{QVq́|&[f( SSSbmlll@FEUv=0===y4 o1,&ޜe ˵*333؍1(jh4.w)w`?} y_˯N:CZKmߞH  Aw:a&>~m,E, 1xm4M-PJ@Ƌ6 $\b @Qr1;*^ UUq)EY*6! $.jP;N~kz 2d< G;<8կ1??O?'Nq#<;++˸sFRu[Mat7؋kǣqq[jX]]'|GyY.l&v`>3|SMp'RU?\]WxL:M8,&N<;s/[px{BQ?oibkk KKK( R=#sҳif `vMvR{9܌nۏb_I;BO>$~ѣXZZJ%\~bǏy { @:i<@__(.ƾ=7xWqW_}7o`a4~=oZh;MBlԨB Ξ=F1&=Fg⥗^m([zSVϱ+E, @ӶN4M\z/_+˸r N:}2VVnd|Yak6h#>ܹ/"s8d<;ߛ|QC=>^oэZ^Z6t=OG F]^/eE~)<áKl5M!h1v[Ql<* HR.^賵 /&jٮ#Dy`,w  :1ٴ=c)<@mZM/U b~V*i%8*F0}ϿXѲ…v}%VRpN[[aϕv,z};:CQ~Wol]= wó/&JVO`hZ;B=_<,r9hx2'a&Ң;cyoCn߾MӠiZ%ܠ wZ׉,F)1 pKJ&GH7IѨQ AfgpEߧܩ7p7aS윻+ؿ9(lw`qb{rGx<ΌtE9c*@ה;677`Vs3!aTnT'=@SZDuQ6#677D(0MkG8F#58rI0.g)CjyHMЏxfak8w\??1}uu}AZvI: )?Ne]aϘCfzYAjY0-knh;w??U ϥ_GክՎX~t$KbÓRA6>zt7o@&A6KLG r94Mlmm^_dcNǧ Jˢ> u,/|j|k8bׁBc ǎz/B i&ms Xn3l˲pؽv* &&&011`WbR'qa4M0t0??UU/m!ӾiaRy[^[˲<,KvIa *)>S (j#u(J(˘FH^w=]\VQP.ݦɚVu<@TO#ǥ~mkI3F[j4 P(\.^͛!ytRud2t:lllR`r@(\L%߸(鈡h7`[T*r9 T*ylllu j<;F-躎j?v;,U"\?!ѣGjP(P*P*_,leLOOl6ZUD Ag4"H&|ss/@Pp NOO\.VzjZ&P~xqUz=~f0nݺjz]}'OF+o#XS |KQF&(T*8ydH^CSN!A4w5AE_G$AݗA4r9:uj0d/677?de=9WTx7crrJBa׿apLVto?,TUz>n`{۝ZmQOqSjs\vKL@)9_!rTr:YSA D (< ?8 JQڏ{zs7O| 91(>3VkWNTs? 11??_ͨ!ȤX+ſʏYhνwi9ٹFt8Ϟudr'A鲳ȗ#}lр9e8:;;;p]b:"\}y:TiXs, .!$P ?Igrݔc9M|RhL$ o3pj(;g9#(e O{/Iѽce@6;JZEn$`y;?cɤG*>IG/`ّG7A}}~⤃DoFH"@d$J4$(΄{W#2:)]8IENDB`qstardict-0.12.9.orig/qstardict/pixmaps/application-exit.png0000644000175000017500000004221511023552141022641 0ustar alexalexPNG  IHDR>abKGD pHYs B(xtIME $T IDATxw[7;]ӛg).cm0vB1Hkv ~nX! !nIGB/ f` cxUr~֣cIZgtQ9{?{oGmFEQ o<DD(Tʦd2AtT*6 A0f4}EEEk׮馛 AoH{!tZSO-E-UU%t:T*t:t:My1t7GFcl>j6?.//T__/ u{lx<~,-dҞL&JJ2^q#L#H@UUt:zQպn:u;w_ի(|{'?.Nŋ VVn6 6 &ttHY!"$IB,C4E,C,$IHL&Snݻw!}Mvww-^(JrPQQrnnh4"Hdo١`0`4BQz!I0fz婗^zi> {Yn_$IZHB$vpD"EQZ @ɒ A+h4`0 ctt~(UPkSN}?WV~_~z-ID"^ٌR̜90LH$eT d;^z>^K C"f3TU1:: # "Jd2vSLÇ Cܞy=-mIEddfCCCr "EA*܂db|> V^j/)A2(PUo$IN8χnx^ ݾ5|. N,Xx<o6p80k,466"LBEz=f3y6o׆~Lh& YEQXLR@ߏn  ###PU&)t:_\b=zV|+;w~8Qe]lݎ3f0b1P,O!)jx^UU #۪'@@IdIHAA(,b 1<<'N`ll t%TZZn_7nذ-b 0ͰX,hjj¬YH$ǑL&p v8vwy W@{FBX,QF!) חP6~_E֯__p8NeX,fc'qdn7F#˴y3OJe2< {JE< a0( Bxr%Itvv@"lVʾ\swtZXh'Ou<o͆Yf;Z nz2wI H/F>2 [2, ^ȒhMlf,F'ѣǙ5p8o]pz`ƫ_FGGHd5LX,(//ǼyUO+rd2Ae$ IAUmZaaZL$%i -lfш`` 0ep<$A@đ(i?N8@b*johhmݺu[lْW{O<M$lE666bڴiEN'l6$d2 A@lt$)Âyg#?fVf*"+XVt:aAUU}(ߏHŢ>z5$f_j[oh4z1tÁ9sr!1Jt$IB2dVVhd`0@e7{PXGGaXNFDUܑxx1-hnn^g`0brl6C$&t ~9Nvi?󡫫 ]]]Btp:_n-?xs+Vz<o]^^ӧCQI$|N@!sN8bqvknd21!STB dۑJDjdۑL&122p8̞bBOO)k֭b^XsWcX^fCee%uJqnG<, ᛢ(x͆2XVRUI)E!d5^ptB!I0D{א%tp8PUXƬ⸻Sl}7; pUW'WTT`ԩeXٜ0L"/\˖-C]]V+$IB__ۇ ޟh%Z,r wlrJDym݀NC2$IZ6mn74~? I#|>BPF@EcǷzmٲE(]we\8Tj '2VzIPQQ}k0'O,s^#WG~MB,cߛW^+V`駤S;;w"NxcccP)+)C*bJӃb1tEEz衇~r!'[l1Sl6_^DܭZ W\qŹ|>qR)L&P..AEQF!"l6J\ (?bttEEEtx<.&`0 d(A,C?a6պuvv>W7x7L4QAX $)C8Os'ޠ,e,bFئj}޷>J1B\$᪫bE6}Ʉ9s@Qttt@SpA:jeF2d,$Q$dY>ѢEzj lٲ$nZYt:B3fB(bٳo>ݞQoH(q @l"pwVkkkSUda/**b*AQ% TTT`,$C(XA&>mMR뮻>1زewy0ϣQYY.tyy9cdYfQQ̞=]w݄!^J0::_WjeA2_$-)cQ(,{GmaCCCBSSSFD34P RQ<$SU b VH$`ppT*v( N'N', 8c1} iٳO=KR\LB'tˢC~RroNz###裏P[[o&/šf̙3 V+^ZeQST 7D կ۶mۏb%%%r L&믿eD$}YܹVnTL#eF6B 15)d(%H[Ʉ"B!8pv ?J17u UUU)9E\0㖡vBXb؜jV?dX,|>ȄL&QSSn!kd@$DWW[OJG8zDUh|-aRJ8n$I9rT y( Jngu{9f"-|@:v5-qF L&FW bfbKKK H$X (;Yt: @Gzt:3Ju˯x e|!DX@ BJA Are-2F1cƌ'<1эB={0[ ,@*JUE"~VM6$IeJJJ****ꧼ6}D"+WbժU6D"{ ~N!](Ҋl#}@_ϧ ,eEan(&&|!\ȭ$IbQ+@Q{ _o'֯b ʗ~{Fd N088әQG&YI 2R)\"NJPTAdSF)h0ݎ)S0-PF`s^+@w tp<lٲEz_<GRx<,<Ejժ{_ǡCX0]|Q)/xBT0J@QP!bC)gP`[[3/7>ҡXP8E"Pѣ?UUJtʴ19::Ux<7r;v /l6!3G'|@旷w @Olۅ^/}KKrJ̛76 }  \.Rxw/_f6qa<쳸N[ (/ TrNGFYng85.:_)vMRhnn%\2s=#0sLO! gC+*@ۚ5kaL2Wz hii \,DP/c]B]]]xV>,sK,3Wg0):遁)%FYhEp8 ;@<nǮ]{VÁ . ch1*B"__ N';h4$pɗ'  p8PSSskmܹEPڵ$@J`4!2Z[[0DYJш'|򴭀NE]1N? Ω:ɓu* IyZO+P9 ^YfM棄_ H$ǴL> e*s ;0eeejצ*g>KH$pfyB*{N'$I[ouV`ʕY=YJNI‚_CQ:^Sӧ3 2:~Ge+{HΩʄ/k !@~>k+^~^p0d(}Ф3o".pBng}6c(O?秥3 R`0VUO0:`0ȒĝuY\DŽUd Q @H Yk.1v 3RNhjjbH[x<$i& ֶ0JA')kœeͧ|;v`WĐgx{7P65PR|GV}._R:lRG!?dfe39|ZYBNk3\ xH Bv/lJ?ЪCCC3ict шÇg)AMM *)*N~*)*jTUL(ވ,LRPxm?~1y|K+Lms|e%ɺdNoo/Vlg;rH^+f4QRRk@;gUQMTůP}'Xͫ Z]Z?N2 `z aZudv:\LOONJ#8 ̇ht9D܀_Z(z#)#Uck|&  ^oF.W,Pzo59hVA?^ypuCI Q9cmKU ˲n6M k1f2H"&x$7k"s]3PU#bΈ)ukUZeSt:m-..M 7;d WDqlȶV) Q|d. 7Lbe= v=x7T{}ua[Ľ MDhWc<Rl+;[\>UZHAɷ-M!xŠ^~s4r'%)@R#(iXњuMc)f7|2D\HyUri-M.WFB[4B2UAHUUUuNN#0m\Ă h, |) P:l8ϕ#j*Eq2h6ngT˟-T*4mMi-?>_ ̗Q50}gjg\0*￟ s(F;D ) Ln$a3~ veժU҅_|l@(`Ad1ZZy4pEА ~l 3I|rTTTLxkE~?9Jgh4}* / ώeijz+  vdsTq{UWe̯xJ!SGmef:N,()Oz`FրL0bm޼9OB0K@v}G.V8<[VRRkShiӕ:_WY_O%|ۘ$IFlΏhd}}}c#&\oo/lvsMPwh:k,Yfҡo6S&-7*JKKr >o޼`6 2K&_D~y`07ޘp DlW+V"&@ Rv|'U`~aN=|t:Q^^iro<|{ɲ+Hq|a43s3>d29V̚5c4{<&t:F U-o D"]6$X~'ox<(//GII [ye>ȃQxBShqw_l.IxuNa&I`0 fXټ7ߔ wޤ^ IR eD& GSII > Kx @i͎;XMTWWu(E%%%plڹX|y::'"j}cF&BFbTU#+K/4o'_A6$AdYaZoQQQԈA RL2c;w."||?<Cw}ظq#|>I$d2ɰ`+ BXp!~_]xtuu&⨫F8apsUVV>`0`ժUX|9ֆX,6AJӨ3<3!رc6n܈"06VCC^/ae4e VSSSʁBDL&q4Ʊ~.()fc@Ō`& BeeezG>as=Nxv'OXx1V+:::022B̢am{{I[h.Hdrttt0KghhK.eQ\\žR#ldM?A~)SPQQR8N `v ʦ4+M+7 n33ogLN d;Cѣ `#"MbR)tuu1EZk׮rP6n߷oŒ$& 477Na {(~?KzP#S#aΝtaI9s& Pg8^/388"(BY B!H7xw^퉪^/6mBI> f###|FrfΝ ښpI3fȨ@q\8~84app 1cƤ6<Dk.$ ̜95Ep80k,XVVLHFYG:E~Vgŗ~~aEKV,p`d2 FFFFN[/>},ˮP(Fz ={n\wuV#uXj mۆ@ yEQ088Á9s株>ϣonlBc6 ^z.袂¼|ݻw??p8  4k,)e_ͷlA pxYY[U1´i2*upq~J5, 9I5>d;.]ӧ7JKKQ__A-  ӧOGMM YHG>m6n7QRR*TTT :@@ Cm6JKK( |>˱uV,^xX?_q*mذS͛rǎcVh4&kkkoɶ=;dYA,]4#t:!"^/c)G{n^Jhb*Œ3peCGGN8yaʔ)\ߏx^6=*..L8`ll `@b䕔f1E[n^~agb~a[lVڊjMV?E9ԶK/GDO* oUUU?Æ X`d3<. )c[ne2hkRqG$SLa dt*yH 8Ìw;O2"/ٟ9.cׇ߷ܹsYI}OO@o|&',ҝ,U[[GGGW^;/c^Nk'OfG%%%ŏc\}է(A ?immmя~?l"ۍ)SPn(gJR+D}7M-dk7ζ$.rݻa(IXQcѢElP;X$c2[ k?~2Q+FFFšEhֲ1<ʮK/L6-k}d[َr|_Ɔ p8p " q "JrattcccFXd 6oތXf А8מ?</I Cpٲe,SXͯn喟 i3f̸UUw֭[ڹo&r4lv_ܹs ^[o>Nqܹ۷o|h41^W0rRTWWcŊX|9V^I5smFMG]wŪiDnG"6޽{Yn.[lٻ;Xp(-[ ?~ 7 yhhh`vۇ;v*)y?M˶A6eQ=X7odt۾};ۗ7f,ݫvծPKko~fRߗoN+׳ͱ(A< hllĜ9sk. %͛/ݲeˤڴ݁Sz@@PUgf1*Ȳ yIP^^Q_ؘ\"k}rQlElSmCGl_uu5fx<ݻշ} HZ[[Sׯy %IQYYɬMMMMaa2/># YɼdN6᫪;= QIl6TVVseͮ,clOcAPRRo~?5CI/6ak?:,TUUЄکfΜaFp::u*~_رc3Z' @aR*AXBlGWW رlSns+)O&xw{.[ytw #ӦM{<̙ =CZ` 3L@@fضmz)vMfOLÓkg 2JtnGss3,Y mz=}] 3rf ̛7oo&D/|b(^888(fVw qZV~aRϹV\~~2?7o#<j؄fZd 3Fر===< 466^s}g*OL=wرc&IVZ%(dj"_֭[qM7Cyy9F#pFO& k֬bf_ӡ,l6'Lr 7BTgPO{(JG}Y1{lkkkqѣ4H  X|9كgؿ?QSSSuM6,W^ygyӾw 0=ǶEQb޼ya, ϙL&\veF̘z100 b㏣NӦM;e|`"P8Y @ϟ{9lڴ [nlfK@ Vip%HY믣[,jӃ>;#IJx۲e}~D"!,Ywy'jkk144X/mBOO{1 gM&n7.\Rڵ ###0 Kn:,]4xd$y]|ꫯðX,(//ngC*OlFYY/_Bzغu+^/uZ)S|'?{p7oxN'=\{Xt) $f|/">#:t|;ш"CUUx^q&x~[Պs9K,aE)4kAصkFokk{Ӓϧ088(Nݎn W_}5$FFFXo E/?OJe̙3QQQ.˅3gbƌԩSY`mUT(B@C__zzz /N'K SM l8sYK =z}>l9s\gϞ?M|& @e˖-M4>6mڄ* gP TUU(~c۶m4xh4uuulFoo/+WC37ͬb #  f%@DKK + R:hmmeU͢(d2t>woz'L>S4*~ .˲P[[[o^x!*gRaiee%8~mxAC@$-Kuu?'׼_ڵkھ nTŞJ`pE+ٳO淕ǪRc 6hOiӃ6 dj 6|JxE+g8(D"Ʉ*\uUXz598IDATjjjXxӚ|Σl `/^!>4s|ş(--}{7y֟K[n|wnBɲDfd2aԩXj,Yj+˶3XΤ8|x w ]YYh4VڔJdu2,WU,JiK<u:]Lz`tNe0Nʲx<x*BYl@&pd:ժX,Ѩ-dҘN゗AHiQp"H&$I(I$:aD/Ht8H+,}K)(D h%5HV 7]{{%/ !dy |3e-џ2a£V]<-gr>0Ƥ0Pj?C8'* dB\&~"<s~&'%8S,P `,8̱"'LVZ*O_ T\4y!/ȝ o 3BBBDg|LP pJ7OB?]2OC!>k񩳂\@Os(@:`Rj"Ǎ]IENDB`qstardict-0.12.9.orig/qstardict/pixmaps/arrow-down.png0000644000175000017500000002310711023552141021465 0ustar alexalexPNG  IHDR>abKGD pHYs B(xtIME $ ^6[ IDATx}yxULs20@LHU~Q2O[^[Z>QT$sCFtN_{ 1KH{AX2¾2N&/\Nt1>?7 ஻W_FG=4i"n{J\P|DoW  hO?QZf=@I=;SLQPTME"ĉ(,.c[aӃ;wttɻu\\=*27-\ؘZa|l0b5Y_<`b&^=bcwr{{w:l F9s_aK_R݆[nFDxks}ǘ^Lj7KI3v\5+w;PTT5Ր3ڵkױAӦek Q;{ݔpה%Z{J \\bAPX\:/S/wiTFi^'%"Da񘓛}7ߨLlIeyxR|gzvLt5`ȑhii1 =g"8NbϠA 񌛸~ba4%øT܁QRD6(faߣc@zڝW͛grp\9&{`UC9 ^ q13et5U}5|1`<'YT@U o>Iѣ곃X G:@z7LCiyoVh&Ib"X_`-Jq zB@ 74jAx~|`7BZ4EevMNIVo)IA4BߙH6iiiÇ%PE+?="JsS@0:!cLj$X}}<1?tϘ wͽU];.n`~[s$?BU͆ήN I&YYYɮ h- 4[,zǏ3ͮ11a#{Rơ`aZ 1 {nLIo3wg%E 7zq%K)u&G@Ƽp휞t:NH@*)? ؚ7MHOuLP?Nf^W^Fʑ(`X(1c> e[?P``Lh%vIKbUo7?D. $%ʰN"\VµǻPAt<$evQ8C1=`!ŋc z3g8u2ueoͳmU!VUǃ"$?"(CEe=esqf wn "/]DzmT 7g^uWYʒU ļPw8QWW'fa"Z!n&nK$ p&}rS!n]JaV됰<Ƃ) $0#Ȱb1hhh˥m爖UnK"Ǝ.q11ǯ یѣBxx8SRɽU~xȾpme@[[UE{{;"""3ҊԂbje [o] *ѭ$ǣ!8vő#p@@s }-p.5Z*o3 2AUb[☇c8s4*T#m`(+TyRTd%j$pupK9rdDoIǾN?g dk0TVV%44#&6:yJ*aɈ r5$uYQTX=Ė?r |HgN˗b n!e%ouWNp{vݿ~Oy?w'qx1g̙3SLAaQP]uw{$G+I^BDjzתA|foߎgHLLĄ gϗhlh`@,g3',=D})Di--- LۉI 6 zAB&555xpM7;?8{,Ξ;Ztww#&6Gz}fC4\`5福$$p`y9V) 77;x'O|7GXX"#e=GhIp ҒAaIS Y8ða^0⼸Kp`9cX;o11(..Fss3jkk ԗ/+UOkFo~>D9b4'D܌S O}?BCC!*2 ^Q}Ou|CpTIqޠ0)S687AXH#",eep ݿ +WT221m4,?BmM /^٬IJϦxHZ)AzǏGlHJJŽ;;{b!996 qq |28جV8Ѫ"XKJ L:z#Bdd$hGiI N'N_N5fw~ 6DSSa| ԰^RK3wTDQa/^{gCll&333#MMͨDMu5T^[G#\\TJ p%yd`2$c ى `sρ8v6󘕝 0rH A' MaBqq :0rꗿq$ˍٳq)>} ;YeaYE)ɘ~IaIҽT̈́ U< mmA``sE 趸^twD|~ŋp(/-fc]uo xsgc Ն?[{{;._pш?=`2u"nZ.x"_#%9Gk F#nZcQXX <"P C̽ue$ E ŭ!o466-SO>|PJQQ6lÉ & &6C{ mAJ`iw(t_p8mAtWGTT6;Z{nΜdҤI[ph%.VUfW\)/cLuIcPqioR>ISt:\ӻ2͚}K"&'{,u#<" e8uTP$%MFWWq8A9 Opi 'OlӧOcŪhnjF9IS&B Ϫ<ǹ]~d;&'MF9XzR^&L}K"™3gPVR.ψ PR\3O@ޥxw1~=ٳg|r455!&6)3RX)H=5%qP+s2Tq<)IFcSΟ?A6 XxcĈhmkCqajk`EQA!Z0bXvm߷Q_8GsV8$0_PS8SMEtt4.5`}BdeevaEp88C\+kz!jè<ʵ_h>2,UUUX|93gI>iuU!gƀ3&1RF`-qx_&ٳ . 8&OXh1PTT֖#<<8x ._pl۶ y$8T@]]bb̘6L +w$Dn4ช}{;@#ֵuxZ,뭙A.wqvڅZ(/;Z,9s&>#qAomm-X uuu0͘A|1+Zݓ1XC6E_\O҃2ܫ0-y:"##Q]]uA'F¨?akS[E\CىI&o-CxpV\'NDDD822\ʕUWo}#JJL0iQ +x qv&^̕z3umF8`XQZZ KiiiL&U!bC=2 {VBCB$`*b( 淟/B ٬)Ą4L&ᡇb*_(/CɄY Նjf ˎSu9(yz Ǖ:DD Ezf:L!&GL`XPZZSBq3{l+43O-yYuW}+%%ڬ={6x퍠K͆>|LFv%羅y)$7A*l6=C]&~ͪ)+&,< 0 ߿kXۗ7?ncݺu(χh@vN65yGZdoavF{E|9X!W=jiOJY0aaʄhľ}~aݎM6`00+'8ٺC w|O/((ɞH _?:ϗ,ш8̙8s,,Xd//Ė-޽0\ď'm1(&jtum09`jړY0DȈHdfe@cϞ=زe- `[端70+'QQQfa]K"r3)EEurf#) >3zF9zZ Jn~}2&1!d9'D4|Y5=ìFhhHbbcP[[ǏR}=naf$`a'@!;'11/'^͙߿iW*++Yn^)"3 ٬d1AM;ƦFɛp/tqq16OR.G_~չ+}ٹ3hRгYȂq"lFm]VV ^/ v} GvN||ig=90?:"r;էRƉCVVxLJlw^{5|Cѯ7߲&롌v&HDVicq=!a$ڧ$Bd9rI[:mOz+ޜ T ʋRRk}\DK7^ O>|bSF -ܰa7(vg͟[K}fau6l ay暈<5wMt /nް),HAВޙ0vw}f޲_hkmJ(>FDV xp+[^x0llܸu -]nu{A5Dw@ڲn˱+}&~;v0vY_|\{mժUW}_~9L2<`LR=w﹐{['" g`YM;}~A|U ~'ϜĖu[*3 _Y0aGp7o |[^z[ kT7]= e_^zi{㱒 d? ^߼ns5NNyէcl=V:%a`>Zk~/$JD?X~'?ēUר}ry#ߜD9"3g7CrxO8.QAV :Rrԉ>{LdϹ@L8wh?:dʼnc7-*2z^8ybX$cB):ZYoYk,]5O|Ero}Mw]9Bs*  wPBdHH/~AoAAă)U i8AdQBƘSn5k!MخF|$^k"l c>/σt|vR0ҫ4NjT5D`2dAz?ɨ@xj>=4vvt?Jª󑘜W)|鯜A$+g pbp'+Ps 2d _Cb"_*A-IENDB`qstardict-0.12.9.orig/qstardict/pixmaps/pixmaps.qrc0000644000175000017500000000152211023552141021045 0ustar alexalex application-exit.png arrow-down.png arrow-left.png arrow-right.png arrow-up.png clear-right.png configure.png dialog-information.png dialog-warning.png document-print.png document-save-as.png download.png go-next.png go-previous.png list-add.png list-remove.png qstardict.png qstardict-disabled.png search-filter.png speaker.png view-refresh.png qstardict-0.12.9.orig/qstardict/pixmaps/dialog-information.png0000644000175000017500000003321311023552141023147 0ustar alexalexPNG  IHDR>asRGBbKGD pHYs B(xtIME+y IDATx}{U}־\fG Đh" jcLy >llM|BHm&M>IcJirio(h \^cgaPLrxsawY6aHio<9@@9Rck1,zEagI }vmI{rJt~526 *@j fFHfyQ|9!r_IF*wPvNd%BTR%}v "EH#$liRt,:_FOWPQ|RRwR(sӎXw-!35P&"C(+5c\@1Gw B'C@?B'kp3!uIa &"#>H[!(ꑥF(5o H"aw1¶٢E,Ypg6Ι3aƌT*L&d2imR6R>/r+ݹsgݻbT0d}0Br7VhФ0U1pbZj%\v綵698nww^xs흛6m:S P'thbw[ m$|eY|s=5]ve_ŋ>s"vڵ{ݳy[ \(լݥ ijnf &j5+7 h%i!Ӥ~|p駧o3.3ZN{n{7ȆQ8LC^M54R ȂEORWnmڵK.\8ݶ(/ v}ݝcAR~&'0-Јah!79֮];gݺujooo}wņa ~>û>?۫^-(8`"I1&5C0N  $SɷRxGvZꗹ\NF0إx2W!k3E|+߫>Wppd WIcj} >\s#w$j`j^99`YtzrOnzet:u"/]}ضmv/yK.~1%@˔4NV3ۛ|q;ڧO9$foa-.Q8#$|9wUk"׀;5k,O cW}ʖ` #aHX&l˄mZ0-`0BJ8:(\J EBAѕ$0oT\|NV} 4֧ODInܸqۺu~E A.+Sc7(hi ?WZ{+%_gO[]0 ͑N%Nڨ N&A2m[08g RBBH\l\9dYds y.ֈ//;1MYzZa0MDǁ)v( ٶm裏Xl9Os Sx.8D:a!PSAmM-jkkN`p086@@|ǥc\#Fnd#LGΚm-uFm۶xWl!^JH%$n@ (PG.Mwmz%K̛}?i0S dRCm}- nj'- ZS8mZM5&jl!%s9s(==y|/`hCF.W+g7͜:)$عs /": j.w"A! i߯A0svl&<+.sB;/eqd ԠL- {a?W!@ŶRWn ‹\! > xDQ=g66[tIOr-L.`?{jHM-I$=gW]uՒ͓ߟoیIP? hڈti3ogo?nx~[]}ceA}Ci1|™X^? HSlԧ8^=E) 2X4R a0b?we睊Lrb…444d7oCA]{՝$ZAcU nݺ97~Gy(sdCݔFMHD-?k>vF(p_=^o#[xX]2W3n aZ }[_ƬiSq$ z !R5Is'zϾо?j=P">aR ꦠn RZts?]䱭_65:FPtIۙ` ɴJX>Gbq;l1.9O<ݠ`0)% %C0B$hT5ɘ۶ma9e_}Oz?TM HejHS~fo;,#Wtp>zY?cH X=R7K̛P,sٲe?я^-J)D U NTGMlФw};wjᕎH$H"SۀD*N$`xNp]׏9Ԁs^q3 cԱsN)t%(uLi@Tt኿ڄቍΝ;~ 5?BjR@IAQ?JM*Pnݺ9֭[>C!jaҰ,{k*zC&iΟVM"@%RR0YF09tw0Vΐ v+~);57o~| XJW|<67߼b"F`'H2Hka&0L+"/,‹νcu)eυJes>e߯vtҵH3H&S<ԏkn~}W477*la409^.U쮻Z/8<Dt- +NG~!fB&GQ$p]LlF&Ҍv ntV" uwuRmE 1Jn }aIK-'RRb›mٰ)Z0#nY~^UUuNERp|0vl_D'H }P1GZ$i ??wUW-Y|y#ivVqU Ujjcƍ+ #~8wOLˀi'a`n٣Qڀac#%~! lQ` W*S@׊D˂El vv2 ;ix.O߈a|ƍ+NLFju cONc~'= 0NNg`)fF xYQHd5:+R2~O8H|~o?@PuS9/L⥽񁙍8mf,P(}ꩧ_MkWYJ%b>p/4W~S90 Ӷa'Vܰ 3$*"+J [1@8&>kG˾[*_pξr)7ðaHej`)0ކño\J*0Uإ*ICnݺϏ{ٛxETܴ, RrpZVjPash̘,\*)zAxGhO "F H)a$cR /`3c]׺Lώ;uyD0XfK_RlmⅷzaXIX4)7r.eDt25+$qRlWϏ p}$P.CySѱ 2 Z6T +n&Mzmy5 h4c@%P93(}뮻.E|BA0)'jb{ZGR.NF1FP6A2dG8gV&\|8p4_nF=VN5#"k3+ΊեPݵ{am0h| ڦ"{O>=V/vR0g0 } <+w2 A;2_N5[Mc>tɗz*`( zCBC~ 0I~.㹀VOΛ7/sYg͎sRo vn f7 "!%`&` !Mo,5_/~qa6DJ49,3⊅zcη Iar**_NF~@ xN5$t px ؄J*V$( *̄L3L<Gƚ9a0" s$*UrT*RfʕMmmmߟCQ0f3T((e.!娽:j?׮u}y(#I|%P%D!$  _L[re]X1٢- 蒄^J極B-'èf\E4Re iԻY|KjqN[=nÙjI{UO5RJ\ΘoZBI _tJSakmԺ/k| `x#a4f- acRQH&"`ʺhW'zHP>I ?dFt*V +@0M'Bo ]X#]@2z#95{QE H,)&cmPK+¨!Ia+ף!Q /8sjH$vLW5l [GeDc>j 2BT DFx^h>6hJD8q7Yd^ǥW-rZHǭ 4_ݒ~O9"Uy kr|~N/t&w.BPc 5ɲّBH8:eo&V_\8 0ʷG.B2~>hjmkkEa+tJDUߦ Ԁ p3S9 D %Dク' mĕ !ꗛӰJhQ(T/@2jpF0 ×{A*l2Q\GEX5AS1zUJ@Ҏ5tLeD%dX+OYm< We  >! UCdZ M/ |CD4P rTG~n+乂jıRI,+ʄN֮X]î 78IzCZ~ΌmK{uQr=5(QchWƼEM&!I9u6/oY+N|Һěc ;Ww,޽{c AP~ SHU@,ߌPs7S(૭ (&A~t7e*r9j R"IDATZ1DcW{#ܦLkl0Xt; si47M ?ި,VS7_1DbQ?y~%]1~kx ęcu恰:ep4o ?KV,j.Z" G<p&8:zT7"¯#|pK9AjȞW iSMJ0)bX+ !pF{qjOi);"d W0=sHCxP\T`Q#@`1/+~hoz -q)U8ݻt,5 P1B ŢՋ3`E )arA h<UEc/"79q/ŨvjF'pFԇ /tϗ/08j4𽬠Hc exw ɑ?o[AٱpoդIET=--,c$@}BX=4t# ިAoW_x:lCݒ˥M?dT^t3Xz&}2GڃfqTT2&*Zh(ktpM &ǧ>|Z,h4/.#@)Ę,}iӦBT3BWGΞ 1LtG>@MҦ㟽Xq`U0ӲK+,dڵk1%ILuAP B I$Pq3"@dC5둿tb?PƻU.E-$@17JsqN48 HW) o3H &aX\acW܀-O R6E`"*أkW_|fhXe5s!+*@SR:<Dy݇ BX*AJL` Ega eږ4&4PJUk]s Y"ir|Ï?c*@>nNGTEkS 3! |b.)>zd^G+) $zL`z˰ >Qed^2WV a ,a[*RT +W0 @~^WVDTB6_ „ 5Fմj |&,U.2$m~܅I{=`7¸o֤?`iG%! ٳg䥗^z;zdrR #8Cj aPoAKp\'[F櫂 .`" l^q}Ro V_r̘k_z饷3o=@]C؎I;*K {7YIu?P. pN%%Qo,34sB_^8Z!Es] ,6Vq#d~sbuiW\GrJ\P AJM.:k@g4#D//M~hkjw7\x3p?HSAl-fѾu;A+ƽuBJ82 -:hS5M`&Mڊw4UPcwՏWjPāC828B]uFh lV;U qBQ4 N;h*6]]]ׯ_rajˇB"ΘQ1!qOZ&]zG?G_{Kykđ 5p`m ||^s/5t.=®jp+Dnoi@3<ӷjժX H,hk9-jdžG5kl!U Th"O ڗ(ٺuчzhD:voӴ@s DPH;nW[,Q*:EDn7tpoMCZ nQnofxKhd2/jܹQ˿c4,qh"(Tä-09h~+B<ȡj 5z:x>=!{vs9FFF 0 aTv yKT*ygZY&Zq&zr՞nH'~"^E lXX#>5եpڕ.E}&q\oڴ}sӏFzrCQC?ӄ*8k(8 %u9 b}5d@]OI0 \} cwTzܹsυ^NP__[m7ɾZ~&Sl6{GW,[ʺ iǓo~|n$TekhM-]֦ضmۋW\q|rE'7ֈ߉"(Ȑ"$WPU4UV&Ϗ'6ݩLw跢U(dH 69>rlʳcWYzӪ$.z5&/x AE"{4wqޚ5kq'}cCy<زϽvz 3NuН`RYXq~; WK6nܸmݺuz0؋ ߟLL - 4馛>p뭷^NS8CxouCG{v6MjpڬF,loNE۴yfo6KYbj>`y*(l"믥Q!̠hѢ|VGC}Y d6tթkydj Za 9{2&g!a3JM6]tW.a!#|Us0&E%RtrjЏAWpڴiǎ;tYT*~__WGqT +y@Оr}U+NyKP DBok-'>0 7xu݇~x?gi<_YE/4 y>'J{-rAj)j 3X|yƍW̛7DΚ5kP؇ xVGQdqe $FV$qiwۗrP8:o]]]ookwޜ,])/ѵTꦅSTaH4ms]vκu>^f qnذa6@ rԤO3Bs|7oF1AB}5bƠlzWZnᆶk.Ypl9?AB_~ 6氦G5߯vb 힬VDe|hc#~n/ Ξ{n7xCS֏ Jr(̩F% ג:X$CSl.k-^2!DGGǡ]v{l޼7a`}F5nh1 lAPx~{QDN! jz.+ķثVu%{mMծm\q /й}M6ACCP-,ePeIxd;FUJRGu۶٢E,Ypg6Ι3aƌT*L&d2imR6R>/r+ݹsgݻhh6P3#,7GhNJ5 緂J t?O?%DxFi`A27O9; DP|0n[D5g5ٔS{qcNjbeRd,\u $#d=E2e4-91ԓv"~J60*֌5 ȟ,dKv]!YI;Qf!ʺM[mO[~] |-E=s_Wz/\ۮ@$=7ơ[> آFq_c'n Ф|To1u*~G0BQ1e, e7\ݩIENDB`qstardict-0.12.9.orig/qstardict/pixmaps/arrow-right.png0000644000175000017500000002336011023552141021634 0ustar alexalexPNG  IHDR>abKGD pHYs B(xtIME #:7 IDATx}yxǵTF2-h$X$1$N8/K{yljcc.Y;'Nɍol%1m0 $b Hh3ӳVOS=U;[s,eL2Y&d,eL2Y&g_Q Χ(@e0Үt@'@ ^ kyNiC8& CW^>[|<$DLHGzz:2顣qDWhkkCk[.Vu}#W;IR^^c$` YDxf͚FHH&@=yfEcc]d2i>XX,8`@IYY%'uӵs03;aFV#\k#ѳ| Nբ"瞥X}sI!N$H6=ļ97ouP2TۃC=ug`4lAPvm@EyxEDlΛN>]Mr5 _m8Y[12b8u _;} `ޢE1xb~I 旖B޸ڇO;3XV8y 'Oj_ۻ{??0Qŷ9D䄙5k&/[($ zZ' yhшBccㄍP%ۉ[5::+-CVfV*.aFllX1f/hT :!)J"O;0D+D=HD "%ܜ}j$ǁs<0qnþ{͆!456!##I~k{cG8?%&y996'& Y ϟV'Dssu\ XVY2006n?X6gZڊl߶hmKMMHHwRp%Dz]P9!|c ӧOGdD;:93Q>+/'mn-IK w\; )Sp痾i2 x C!F#=tuw`0C~~WU---hjjBZd*>*\Gr1tttvb8%!)K,ܞyr֎9' XU\:r088=w HKKt:T-[47dJ3p% 5ip!sttuwcddD6><''?7|ù} ,!T:"BFFp ѻp{=-ׇ=wchh999xa0d% ҥf455"%5A\ǡ514ӧCCC2 )*rg?{MO*/u"bjmVv6VV@`̅KYIy{##&+gy1־eUUE455RSRRRzUsW{2}.,1´i1q55)F*'/ʫ҉D=-iӰx"#CaId6wՊJl{)y$cXt).͗.!yTG{?1_A  +rٞ ՇG%byLҰd"\Wn9E*p?mXX^۷;Z:*X-Oq IIIP0 p:zU9[TTPzME9IW$%%r0r}],q@) uł& `+1,[ /_ŋ܌DDDF} !eAK]NIIA__0r*2PW!%VI_9[計H,NSQS_ pȌO/bʕ.5 ",D[{;_f DFFZFI[AWFPL]λIhfs @ kPUUƉ#"Rt:T.Yj@"%!ɸԄDFF7*+*ىsΡ%'$ 2*Jg@]aK3 HHǕv8R dRhyɜJf ¿(=| `~I LC͡έ:Zbbb܌'N>AEEzzzЀf#**Ju&Tw#%\ž\ qܬ#""]]].F!rgv0b"-oZFfetqU):Gtt4L&zQ[[;W >ŋׇg܌xGI5}\.s $,HVR\X3gzndeg 0\_=y#)) qd .=XAEa``uuhiXDGGk2[Fp]1#|qqnKY3+تDs%p%ƐKPWW1WDFN>˗hUz+g"#%ST<ЙJ3@Dҹ*seLӬ׽yԦgCgGի1`6p)"*:111.pn ^;z bqX607/'~;"g^HH=sܬa>>: FOO.^Z[`v;N/FEGklHD`@D:pdmu!fT8ʜ>qqkݍp1$4_F$%'#77o"(--?+mDlJ-*z{%=_`008 0do'n_1l@XXrss@DåBI Wst@ە6TWWnwo?KII Bt:TWW#66?.8w$HBE=9t_O81b%fef"*25@kL1LꀫM jo/pw:g"s"44GE{{;B0\ %NFj@\6MĀמ8 #+Wƃ_QTz̘1C˜¥>"%11&9ňtMsW@eDraJ C^t2-({fhB`Fnw)tRSŭ;UDZT6U1)|2N BGG!>!^@L-'A!Bpl̽r_<Pe~x _tϽ͒NY BwW7zQUUp3??I HH0Q-8\쓛cX-0F#J^=~@P `f^޿p4Ӈ}HX\yp'M.& Ό+J/!CZ[p20ajT|G!!!AO%4ڊDDcΜ9Al:n#))]=yI0 sh !MTW_ GD IΪ&RjnľZܓ.uZB1A@Tt]5\303{&?nX, S=O/yT45W^Aa`L0qX@n~z"ʔ:")gc߾}lFRR5'=(2ja=l{fD+w!,4UkqJ=ץ'<.bڊ3uu(,(iӂF(((@OO/L& І\T<3InXaB_8G{"D$"M&>T5 ­uϹ `^yK֌,0LrRQzCCCn9zwycXJzz:SHJNޥ]_:,Av董g#ٳ!j;fX6Dzk,LQwCnJy5bcc{W{{qVZ`4̛;}^c@-R;5>REQGF)RGᣟ$ ]Pp/ʔVG)fc4}HX(yXN1^ƝKU='چ&$&%bvAJJ JJJ !yj2T'ujYmLPwNr.˽'=uEE'~Qm!4b(J9ZT@Z΍ C~A'=f̝3/"#pJ;N?Q՝^\@j%a ;"SA DH`վ09y(ISD7{!{&#%5#F#6nA,EEExDLt4گxM v tE'łk`21XM03WPPTSlf1F5O4@F'\(å \]I>nǣWگsAbb".>^\TFfh4PXJ`'/$8FQJ PZ0lv;DKyM^8n%cB*N&c:/˗NT.%.on8!؜NLPD*HkFl1f{*\=>PK)ؔ Rm̬L6bxxxB 77 Սc5E.0F̻kd)<$DWQf6b(;\!E=ơ,&Yl3 thr;vD3gW al-EX0FƖ?!G=uZ ";f \bbN c:휩V'\ʭ͡IAV8Wۛc!21ZNll]vN}`m7Iru[FXm6bƉۥŋXs !!1Sb<\Pg`Nq7=GUy1JF==)ߏKM;I.+ 5GBB**Wl @d$?kwJNJc6n3@ 3+vug9}(7oB?{,~Ðh@1iw pjzWDfhqfigƝ(De01Xƹs1w&:@bR"9S׈#VUըYYouW=pAk:ގpܹ3h "R[[¢B"Oźu @}ܽXw09r ߡn6qyu#szf?y$w1<|?0fPPXp k'[{!}U9!r_QQQT?>1~0L@aQgW-<ߺƀ%NĪAmz[XC彽VpF̜1ѠA g>]G!Zڭip;}-z1ޞ^"$$;c Rٿ?=6Yӑ<>6T71::>mztM[!Ŋzp]NżZ hjlBzzv$[oa;9G^~>|7q n-ANކjz>\jjcvlx <bۂȜ\ksW'16n{ Dz_xĺjřgpw {3_=O}$,/}i]vV*0,?6d2k[0o®"3+ӧ>I]Lk~G^0 $][uM٬>v_@DDo+dT x/3|jO`ww"O ok|^GP{dB}Y>W3ys0m4/f~i2B5zOr^WM`6Ou9NמfŊ+|% _^c"==q3|Ύa?}Z[~ f) W^`m "~߂1y%󐚖qz @O!z}_vFQM#[E<) :,\@'6>yĺ-Ї@u@Dd׬* qIDAT%Q>nH>ue o~ē[@aHJNzggnj AB0Z7WV- 'BS6{p9/J^Qeˏgt:,^ȹ׿W7\>Km|9bjTƓ5e\>88Omlشi# %`0$P=Ö4 zЁ+* oQނĺF9_Py2[qET-Zؼy#^%r뾰y澛,]( @4"2z= ho@cc#NbyrՊ ЇQQo^z P!ح?ypyx?7^GFz{Յ}aѢňd£kcK+\6d%u糉z0o3_KV c0,DbXs}8vP]]pT.]h܂迺~݆''hiێ'~ !u8zW΍w^_Ϟoi-vl trqt[1o7:ڍh·m;|% n Rx`úM]G-;ٱ '"$M.+׈ߴ:{4pwqѿm\z c_|1h|nd;npٸ)[~h gQ) @ y4 o[F޽Z*,n6Mpq0W7= 717}vYD߷3Ƶo6݄?~gx?؆u޿ v󖧟ݾO(Eh֭[ś8o*5oZ3k 5tuoB ` 7s-M?~ [Ɏg*KUl|>hZELɽ@M"p7 F-h,/3oszh4t{:,|xG0YIKn,{J@ S 6o?oBD7`? @_l_~wkѷ7ɣyq!1* IENDB`qstardict-0.12.9.orig/qstardict/pixmaps/search-filter.png0000644000175000017500000002201011023552141022106 0ustar alexalexPNG  IHDR>abKGD pHYs B(xtIME "'M: IDATx}il׵MRdRKdڒ"[b;q^-8/{@H ـ3q C yx@`3I y%kuƎmŶ(ZR$KfdѶVJ$%RdUu3?X.IʶD6(f/u{wι j!X"XB)mR6BqI)mFBH9D)HF1J("(m̶mʵrO\B<@²zB!č1Rfr\S.k- -R" RUvB" PHΞ=Y5L% Xj 1sūSN;)]ҕ"! 6pm|B)a#]]]o\ݦ&DT=Ż SQMRM===k?/8qqe``?>00\xQBd2 q$ … q˲ ˲֐@kk鮮7tӻw}Y m&+GQm0::J:::୷[oeYgx#Šy{v\p]Zp!cE9畾MMMҥK0:: }kӤⱱ}}}wܹ}Qwٲe}ݯu]l'!xfRJTU%B8}4AD#@P|qw}$_eCCC ۶m__t{3뮃ŋ @QQR0ΡND"7엾~2EUȠf6ضmor{g_%_644{{ ~?qы/RJ: Xl8\:L&_7G?Dl/:BpplB|pp_߿gyVݽz?QJO|[/_~Zws-#RBǜ=+{ցs~]vO~r@Ju]Xp2ߴijD5";w?߿%(*|/${_:^H$VZ˗_GԎ;>7mߞze^2hƍkJ? !~Í7fP%0?7Ϝ9UtZF{춗_~/ Y*ny۽{lllRtRD"c֭ϵj y衇úud BCP(O:ŋGGGrBƠP(@XZmRFH$*NRD"566lٲ{M 5 b1f>_{O~7)oŃ;noood "qo~n: eY˗//hlllkR e(fP(eYkG`b1HRn(5/SU톆c',X{inu=I)5׬Y]b}=zW=1/C B:_dťKZNeنt:I H4hss3D"0 e뛦 B2 iQmǁ|>RJ, J$_u]]+&c c C4|az*!m !#H?L4m`Rlp2;410 s|3V?d2)8{D,YoP싈daYB5^WŸmQD5MSb5 NhE9 `&XUxmLIX,\. ˲ι-(@AQ|,GcT*5hFy`D18xꩧz"4M˴瞑H$׭[|xx w̙3^z饾k%Pud81,HOOO;D"Ý$`|7IsRq:BA:#!BtpI) =h&E1Rj !h9S望0A@!Rp5ܹsnu݊wޙ9͎|ʿ*ؿO?￟VɪeP('Ʉ8DUUiRuQDdRJGRJ B8RJ&8,$*$bB "n=[?L3 (pB9Mh4Z^zuFu8p@eY IJ|g:y(xጂR2Ƽ=ѧT[f ^mr@D.зV+yA̫e\N]e͞|WWCLZrرc;vk.Sph0eRɶmS rRO)GU{oJ)!Txü_ FE& [J)HĎFV[[[q%7CCC`ʖ-[Ҟ2=oހ_2'2L7d2 o~րRJԛSޤ !2UrRuoR)sy9)l݉l6{je۷yϞ= @PUd BHdW }bVzAL' 򇁁PV$+Vd(?~hh/W=Qu?````^qߛE9|ws.ŢI)B$)A"<čb* +w<x^hQ.J 'xbٳg^ pȑ۷o?n6 «tRJ|SʂJL0Mp#$HttCe^FH$b绺L7ٳ'[,/]TJKlْ*柉,ɔ3nTxLG_vҥ`<XDZdI1BӟtQ__ߟiZ~ɓ'Gvܹĉd:H]9$CSUިw@_I4MwY:7 2 ^pa.JBY~}ѣGkW_=nζonn*14?ܟ9,JVT#8TGeP\A`O\3^2K'z{{B0 KuRH&6ݻ{}'_(ڵ-[) a d$XUKo wF|U _)I},`k~P(={ؾ}{qppo6t1k3onzZHM钔9[D# 6%.}ccc񑑑f]׹v4s1_*׷g`rߌbZhAa.0d뤔0 MuEQJÔ>H !/{I!a|29bqMʆa]]]ca؄|ǚ??{-6 ¹ ~j\O]l:A{H BQH\5LBr8>)p8eY%!_?To/BO2_y?Jl@Yn_nnnmmmB " \.g9#@w} s~$w.\X`YzQ4MMMݻw8hN:M)m馛,Ab Z',N o"zn@!.E)pW?k T"-XZhp4!D(ׯtرs [o!V]v"RB0F !%oT̿\a J7:~E9gΜd9ZҚq۶s/̕>hm޼_vL"˲is.@Hx +1,qҥN&jTx'RMTEQ4GoWt6MӶ,˜I?00BUU[4%(sgyɓg⽞8EQ ˖-%%&BD$hTUU@H=BGRJ۶mۦmۦc~˗/7jj555e5M'|бcǎڶ1ƬH$RN$]vg}SN]{ZS/putt""QUz j$!c,!Q rYJ%V,E\V)RJ!Tl.sΉ(4"cLj&܄Pͷh-^8J(Զm, 8hYZ%-8s1cBUU P#_Q4/c -EQPUUKEQeYdʬoƘV@Yf.nB0O,".LVu/:j 64@V]T@ ETb6IAwcP+q8ڿ S?A? <˩܀_![~ݼ{LϦ 0A0o:! L]`/Ո? "OWl@BF}ts G҄OT%nA`𪼠ڲa)PxԪ<@FSf HЭ(9D|-@F3^A}&m*j*B ȕJU@YRq?j^@XV58{D@>O`&3UÈb50P60e>c bP<@HV:9F)F}hV ( z5y8?Lj` 5D${xG56UQ = CAP ika#qPXUasEuX$ UXIDATX̪g_H)AJItp&~`upԠ @)儽y>#Zp]4`Z@= Q7P,QqOe_8IZ:j- nt[ԣ|&8}Zs%^3uԚR(Xm*qR&Гի5Etj~ty$a1Sz =+(Nb~;lI(V! KVAY}ީ!a[K))"2)%R*sbF墱XٶBT)%CD2#DJIqqN(\E0cfê,i9$$=:f͚8"(n?DPZ*Pǡ, ܹV@ƽwI?̹;WK0=@JիWk 7кzHCC#m9ڶ-٬Hv.sl6[xbɓ.\8*=@ dw # ^ Wcۏs!dc su* %B|va#M!_ 0½8Pv_=?}kN3ٲ,)6K,w ZU{^e C|#->pB.ZZ etwmы@>pxȨj 3׌@Ty@000 s (LA4 *S)~:<˫?M𔄀ZW>(~*_; &p]kx?̠%Q@֯>ϞcIENDB`qstardict-0.12.9.orig/qstardict/pixmaps/clear-right.png0000644000175000017500000001205411023552141021566 0ustar alexalexPNG  IHDR>abKGD pHYs B(xtIME # IDATxyp}ǿo7E@<%Ee[$DEG;8wi'm:dĶN.;]g<:cG1xI")<,H cH$$ ̎hX~vp8p8p8p8p8p8x3#o0 Û̻HWW3_7!I!#{(سgOM]B]iop֓Rc'>aR/Hhڽo_ ^L&CMuDQ@$fxPT7W^}Dٌ=囦D~R**҃?ݻ囹 }~2}x7hي ~cKMy|@|/7hm ?[SoCE員5 vՂ14<4.8Nh)-+R+;& AAT%Bnuv;gmJ9ZVQm57j5jkw2t\,,f3N'~!Y$J.c K.FGGQf4BT&<ر};fۛ_2TT LM2jHu] 6۔?K0:2Z~S,8 JemV,:1<ࡲʪ1t5/+ߞD__/d2x <ݵ /^fâs1+[[0:SOА?c(3P(^>l:7TVLMmyVT(׺1׿,Om0/ v N ކ1®]FFG`CiYYR!` D119$9i6Wnu5?'×Aŋp-.,3?e0C4}i!(/!Xgb3WIOyJ;vks7W A]m-.65anǢkeieyf!&Rȓ PL:(Eի0Lđ`l6A/\.OjJzU*X{XQ4'TcC~? đ;CSSfrAקuub6A:䇆0&ftzE-x!k/gKχk0a@V3$-?o~FwM2|{㌨b_۷Os`KMM2b6ann͗.h4IW:4651; KJb0eF#GP[[z뭷pgöm_DN: PJ}/c zo&''9B*0֜DQ33lhnnơ4@(**oȐϥ@_Vh4;z4-O< l+*~d&JNX!Qv[Ή PUUN1 CP_w1pYb0OMK~[XkJzVkV5fj|ܵ@ʊ Vz46ۍEEba٠hpر_x-8c͖  8"(Y$atxlohhX_j0B#W$ }p:cl`B$oۙё=sfCBЀcǏR (n܈Y&ݭJ;Rb<> ϒ ACCז$wo琉bhx f[`=v1P.QI8"HރmRLY\TWܹ̆ /jQXT|1/72[ԤQ !8?~Y~Q6oFäՊ![]-( TU!RLOYzPSSѣglx@"=i@јtSi/jjjs ϟǑ#~6AiMXW`5fNP J/EfjM98}4(_Wy|ֳWƛ%PJa!4 jd,-_jq~NJx ZԩS pL۱h=/|p\p\Z~ɴBP@RBT$acp9>}Ӻz{{q177\B!v{8U&!?jk9,/r( (u1>gNݻ31Ç133Q&zӦ$ƺ*hw[K9 LL251\^h4=9Ac߃f(Alx%Bz}h=loy%c'Q!"dB%0&ccx{(BTY  >k(0J8'ZB^HF!?sg&?b>2*#!^ FF +]mmOanD*(hpspNMỏ>B( 0 [N2g;z!˓}ݎG{ 7nĸ Tl$Gct]ns>ok_;Xc?3&:/"v޺` @mr tg{SdBOz xM)x R막Ԓ|=Bg#:cc{3<"JZ|JHF<9ݻ Z%Er畖g,Y$}!PT8sR%%١--iuϦ1J>{wuWP %+WIA~&B q1}"f_=C'o;¾_I\onh?-)sga(3&?!x@OOOdpd(- ʲOO;y$*?!_ d_(֟H'0K~:B*_"B J.C.d&tO%YOm5_~Y$' A' έ[ke}rV.tZ-^zEl۶-Ea-5xPVV \g{!g4`= U FZV ށѮGV7|3><`:(`a7o‚(qY7 QiD01m. [bȟ4QW{ %0^D2"Lpd"'r \ۅ9Q xE!ue pw{ ]0%dETH HoB@Ж"8'X"OTBivz>W" joOdZ\&[-D_2_{Z= LbTD6,$lVV-2 J~cvWG˫1 ,"Y-[ ²PAލz"+YX5|$7 N\<"]#In a҃skAD%Z.$,8}^UAXN#^'üc>ޭ.$Q> D.]E!\v.%? ]X!JXie|Eph(]ڿ!l8l7|w$|$A! ůBP!Côf!Uf#p+e[4a?( uj*^w\W8IU!Շl$Ɇ{zQ~oձb^7iF}W/w H<@?f%CLRJv+_VXƝ tϵ7L`;K`c/Am0W>~gxW"ygGuttp8p8p8p8p8p83< mDIENDB`qstardict-0.12.9.orig/qstardict/pixmaps/qstardict.png0000644000175000017500000002173711023552141021373 0ustar alexalexPNG  IHDR>asRGBbKGD pHYs B(xtIME {Xo IDATx}{$Gy/{ٳ;YVvV>;O@ |!c;|;y?csA|p6ƁXzއ}_UUYYY5v*~^^^^^^^XNy't~7m{;n~ (D?$]:{!Np ဈ@j>y@q["sowD<At^g :U3 qksW}~[rƏrlJ=B/zEDVgQƎH'uʢJ@\h[XNX= <\WQ9N .>?sGZGmfK,~p,@)sQVŅ>\J4nt>5V D}@qAty'lT,:c8hv;VoY٩[;hMkׄ״55:8zk ~K<~ dm]\G;}k199iM=&7\qtYȏ\dcff=k(w]7vM<b"a\~1Q,LU }b1V.:ep]7& ew'v^Z .C\;n1p C=nvIMo `R"B)G묇, 2Q{0Q2S:+@y;XTe +ꕟjyCGdS@Y\|Bn03pΛ=P1 0 8v>яC\ M%D 3Y@:߬Nt^6e#bz~0NNYJh.`eeѣG裏vT&tdd j*nxyN8qpsKJKjb8( aKq0}S "yb!v N p0Y@ |͘ RFc@}ށ}D`l6 2 P('."bB!#N>pAt" xK $mBqYPCrAAD=mcM|v4iN)ZtezXpj eFyK8<ٜ#voX$VR(NzSŽ}88m լq9\'v:_>L?xphup:cc#Uz6s8(m '&w\fi<(?J&}j1;H\rCk]2{vS{iN<pQ6EN{W:1_.B>F "x%>E)}\J „Ͽ`v^D P.<=]ߥ"0;"pU})gI>$|MS'pǮ灛f<}Am)luju&whVOw@fl]Sה`iqWZp] ,pK@6q}ާ6T *o Sr 0Z#NRwg ! 9!""pfxMPXM b{H  u׋-q`e|]QWG$nyc'p h 8VDn,&[,@uY^iBi:pfQ!Z wĽcV`*ۦ@9 EvܐA'-Bħ//RFخTĶϨЁ@U:A8s y5Pv!YVqلb[d߹ \XL%aAm}.ZdzLܙ@bb! $98 nV8tCvJ58}t_b66 TGd9Dv`vXn8QFخ`"\Z=1`h\ L#` YA!t/qJ`/o!#ÖBX \Z=?rvϺٵŖ<WC+NWZA1& cl u.l"NTD DJ0ok}/X}a x8c*ohR̕@$oTLh@LAb53:TQ#9 FE "E& Yk 0:U [: ^s9`#P8!tE{َGXgqSCl?6me" W03̇ͪ-bj.0 =_\_ A^q2)j (*,3eTLaʰL/ v\Vq(bEr{5T. K. jDQf kuՏW W* S ب ȡZvk$hDZ@GFr">YIbr7՚#H%>LNN9 lDp Ж J~F uam̌u⍕rp=9ņ\&#\ZnN]#"t hE48*@!o ~ӢY6&Pc2Pv *tmϜ}[phc(QITh V` T`,!h@6}3& 5潸{sy9:|G^pI<,ΜGt9Jm͎ O,(6Ja*@'+ l#`f!ɓzc>MbN88 k4='?>mxIToU9ܻy '? _BF3F# 6(^FBW5'>pN;dPBv O Ke`vCGƀs%ށ~mxIvv߅Oq)e+lpS1A}Y.YiۥU0jtU`϶x6Z;~jqBnzz )#1Ĺ#ōq%*I1NjbЛWpqEҶ+-B=%H|au]u҇KKKkJ%y^X9=jwVޥACi $0MD \?_Su9_y4X,>:v 8fP&lRQ||ӂ1%`̝T+e/\~ltnScH6JOcKw#j{b:rGg療te70WpU x#G$ڵ }jI +% NfldO R}5K2>JkR/+>ݷ!-wM)l@ f6x7T4'uXf d3YpzLkv`qeXrd8|G|+qRgѸ<5j4V+@ 'u,I$b\5]o c\EWk7Qm{)\4##+̪i[XV nRxry&/RN-<$X.ߏ? 1ӈ[\,~w VFXf r dI+^l޸f z8?zz2BP2$L7)uJeBYPk WpäӢɊ KMӏhow^T:{U al#L MiQVQ YBMv< kb!UgޯZb-paC  j#>,2538.׀r/* \_r1\Z@ou x2֓$U_f:73k q~M:L4y 0 ;u_}:[ڀJCp;&tn*Ev߲pNk"q H`I nh$"WrDZ/FT+@&NP)O19_Yʖl6g".Uາ-_1f Y3*ūQfodlE,G&OS v`bbB{sN2( c@H |>rSQlm[aqrWv.@"dA%42eID8~ /\@f!\1(mgs}C_y([\# GYWy><&}~Gm\?2D< 'p@Y0\ F̰I2u\0VKD?1Y8}.P.IdzڛfY B;B(4|}9Kpp8nމ177g>o~3/_'0TM_ 43YAy~CYD 犺1njoPr`[~~Gމr9m|SC&fnH\J[7 X5-G|f)h XY&")T݀*P_Aq>&'~ RXO0sGL{. S [} {àMkUAW$M5lḱJچ"E#|n{o=fyرcGzxg羉Ca(tOT}P(AIà_Med B\Adk 텟;_7ŷtkbI_Em=ɦ QV1]FZܜqx2og_],Ƕp=kĤA wJʤN W|/m܀n< 4 "*{ߔyB7п3/--'FsLݲr5E)@; buJP(-8I"D~2pfV.(ZvZ zp3z4Z#Ý^ZO\,ҢaEt@잀`<`mF%#(?:=W7lő @n dnRwP&T0r[֤H& \F kTX@+@#7qTIsOdj'C)QD3+?tY.@r@55 5ԣY%']D'` QDOUxxc!OP{XRA(.hT@԰OV5 MJbS$DBڪ"nd4ֈ$žߔɯֹD椉5A1Ƭʂ=z9aaHP7EdP:Xh0q~dAߛRH\5jK*84܃Ilχn :[Nx9 ٔ0ж0ihgJOVEL rjMSJx)!3v[ fCmt  6 %y_'{q»3$Gzo#Kn!zN +Id$>Bt4룷d4* [ p@IӐ*Ū t( (m 5R 1`d}h,{U. l`tE'==Hq 6a,Y 9IZUՊɊA0L5X297B?}l ohR7zwL]S| p)\,9 ` ]Hg)ޏ&T JO-#8)n@ [U K8HЃ-dA책iɫ<OI$*B҆{*Dٕ1>dO 8n0E?Ŏh|?6%]fi(``|(E\>>eIzXnw}8ro-lUS/cH9r0kMnD%r,RƱ!_PsD?,"0=+|;`$ȤJZ ʿe(Vg@ӹD"H 9Y,C}cG|TNs8瓲Ol.4H^j'qűTLID%c$`قր"aG=YjebƠ&bFt* 0{U7EdPV$SIDAT1,dܫ. RHIcX20iF"M$ )ט,Fc;߳z~^ wzu_ 6 qKtg˳e; 8ޓ;>5Z]"'Xߔ}jT,yYT B"_S֎ŐێeY9M^0c\ݦ}.qJ&aLf?M̠iO&ɦȟ|SUT uCIENDB`qstardict-0.12.9.orig/qstardict/pixmaps/document-save-as.png0000644000175000017500000002261011023552141022537 0ustar alexalexPNG  IHDR>abKGD pHYs B(xtIME "lT IDATx]wNپqT"EA JD h#(puكNygwr|9_/ u|edWXhƷ}uȑu(|sul-KzkoBX$\QQq̙3.**]]](ua%B S%;fl?_5k1<{n>U~kYrp23!(}MX 0dȐaey,G***O>y߇~[};sW ֭[_vm2 ,ˠi,˂(4W$HYAQT$Ijsy\3ȲlAϣ56mZqm-R;"If%5?EQc41u/8򢳠3Yu5mAyY9'яxUU7Ϧe٧EQYDmm ,>&bky&q<2-"PAQ) ʀ(Ϡ @6milG"aÆ$IZFQTLHYƜs3/w8.+j(~ʲ&?`MZey)9/qLMfe ]0LɞC6\<I jDJaz\ G5 Ef&9 ' d>χX \Y,@׮]QWWG @4`nZEX/jT@=ZܣMn+ܮE{ʲ ErOiKQ#oii4M ='68߻K_aS8`h`_aժUSY=Xv$+zT-IOJe$ ,˶Z 﫴V=&e^zn <&QDurMJ ̐!7|CQQ*[ؘϊ֛PXXMu%Rq$9z|aڭVǁ6(R46fǵ?62#EQ IB3#-oB_;8"0(;G,ˈb>}sG쉇-BH..z87eNH,IL&S}O}r[l6u H&I# "Y_|J[K%RHzV 倫< s;f t^{-XŻ)*|o>kw-¸ی WѮ6PS>)ܡ^IiFԓĥ~EM&gp?i?d:F4%aj1 g((7q%W% ql3g.8AjeX-h^:'-ȊuOjԠ0LֲINWTIUz~fr[?ۥL#IۄEQ۴ MObѢEE6-! 1k0%a%E5J-˞HWPUD֪u$AjWI_!qo3`q( Z>oc=Ef,8r'/WmT&;ФV,ZKD˲l;UBtPD5y/~H}<Ϸtqru?r"(B쨳9=kOf ޛl3JEA ײ+Uލ R$d1S0 8$Im\Z=cԷwtU9 Voy5b\ٟgTšclӌIn#;Q!jܗeYL&؆p0IWo'h@:5gmG~h"-?`߶~^3Ղ`m@] o=;C Wi$*ed+)DiOdD:fT׉S`-o;x0 R+^TO/{f Mֿ:@!8NETt;:N#V+ c)gZ2n4Ҙqÿ/X,1Ћ`{fx-k9Wۀ j8D]+@zC '%5|~9V!Adđ(0&i#ςt,>x1MMU# z"`81^0g).%4J=diauHP[4ɠL%:@ PţvFV~HZ`-[5sغ'^d'5hX3nOu\NU1JE"IH cJP]$E1!qR ba ) _F\Ao6kw .D(Ů" ^| xYnCl"d`Gt1Tf8.AL !(A}pͥard15w%vm͘HaΤBA/5~{}C"Zyo#K$WS"2V$hJdP˰TqQ|" 2yE烒k`{gDp9{cj5 Kǯ||S|]StG˜\k4PH|jYm#Adh%+ǘU @s5NvW_! I%2 O B⽈Ev6=U@:JV-$kW˝Kⅺ$+!a3Pg I;A6ǡC6`(qL׽ mOS3[QL[%)/BA.߿Y Qņs% %JNM0jhnƎbA%]dlr,Q\p"o#윁s. srڀgn׈8C)Mџ4:Wga$sZ@&EꈠREQXvmZQ*Cwj̅Ci|1LD3k5oQYA(=ZDy&T{֑@=7TrQJ$CINd<@0d\^җW|OP"Ua)>acw >r5>e^C>l ~6T{bLNp60]<]SWQPO**)PDa<qG .LG4M!dpz?"a~ ZRzƝVDCD YG}8PUUNԧ6Եj4(wINWR Y B?އt(puos & "aOQ ^[Nɵt' 4H֛QqFN =zlU @|jyԇڳP_ڗ*&|g#XIWʩ(E_l?P nذt'`ذa5jTRi6ȁTt$IbNzH gVT]dϣ>jЇT5aْچ@: k6yc,G$ǁaU%hi`H:<҂kfL,ٶdYFVl 4L6m@8Jc#y@P9 *&\ C#D"5Ts2Ɵ3D1P0߿V/whQ4m G$jmavT) g {^Ǵ= 5׮Ee8E-xi}/6㆚qㅍx Tޗz$X.9Ct >7zr\m c7thlgެ jGLhe,_՚R&]İC_ DG4M+Q2I|ՑvΒN08}v(Ns"2oj؋ν^ΐGrӧOI'Q;C *Ve>`^|tvW Kഹ`637?KsΝ7pî=? Ѱ{ N FʚD7I|zGZ?>7q?jNxV f&xolZCij;ڐ5 G;z!y8A؝E[a5CfXq3ҾUG#qCe ̫lT!Lؿq*q5 dp#o9w?hxĄ2~c^. N"Ds˰iؿ$ j @+|Q'N:YEu=Xڄ®avX[#F>O^]c؞P"~GA "a?W-Y;w< NFZP~ pN61x􂝗)bfgEpݓIC3cugwhh,G5lix$0zbޚPƯU #oϻI.h%g< ebOCv\l#jfdfƘ1秭< W1$Q@߂eo?ksrh] d<\Ut:cebrQ~{8]qu~|a=…6|N]@("bì|tp&.ќ<|\B0 qXƥ=d?~t`?ۏ/n_6 ~cժ70=#PcWvf wy1u-U뇯q#8k p(1W˨ ./ %tGsݰs:!͂?|>&Di{guX$<}]5]<#$C( 2ߑ^S'!mA~ ?<12 f'@/W=P>yP0[D')톩Ti\÷7oތ c mmfRx󅦀[/ h9堹#Q0ၠLș(l,\|YbN+{_FgeEɰoGPFra>U_OKߖDރ S{n VtUdrBnQx vU @C0Y 88DV8}礜WHXF!կVwg ̟qz|C\}O+=Wɤܨ@^ y!gqA_B}m8y!}$&&K'̅Kv< lkٯ6/'ϛ={6k,3Qņ3Bh2^re֜!I~v 9ǼȒ +RQm=PG"v+ 9yFw| sĹp 2z&f3oF{F{yÒ|:eQa(D&;XΉ61p8s‹LUJ^'oXi\2uPB׋ Dė{A5WxFILkO7sǎ9axxh$AXڍ}#z_ ~^z|+2X0!d)  ?5X ~hZYr|d6*ソÁz7ݐ8 cϚAu.˲yhC2FD/huH0~J±y߲kn FO>^ju/?l6mw*aʔs:,w4g6<ν0;nsM׉`ʗPXXxԀё| '0ۼ@2CkٲxPb+ͷ |# 7r5 *?֢:mǃW? 4'a՟UF6L{ IDATQ:;m&afN}=نr.MCħۯr!"8y*P~Nb/ Zmj1ep<'SُH:8$!"yqުshpIMUF)4 `ܹSj-.HzȔ02QXK$-$d8L&8΄3g#ɖTDz._SLixFx0nܸc\UT>^z5v;L_5$ ~@߹ss%0:ڐի=VXsdx`Dh 5𸋗sq NƑty5\/sfK,Xq6[D/c(h9 q8Y?ˤ5y{s|"R0s-))kZ7/vY- z1$U]A<`(,{͛RvAby1l @zO3y(Lv0_E%;wܑ |VkZDl[yLS_m mhlk2ƶX%zKntl3T* eWhNj"HO6X!"]PiF8Y l$L?В AZP*q҈vJg[ـ$@# Á3jt7XPIENDB`qstardict-0.12.9.orig/qstardict/pixmaps/list-add.png0000644000175000017500000001537211023552141021074 0ustar alexalexPNG  IHDR>abKGD pHYs B(xtIME # fpIDATx]{ř}y?5#AQ4Y%p=Q1l6FyqbA$&ٳwr4nr5FTD bQ 30v}}uWW;3SVw}Q@JTD%*QJTD%:kΜiDt:CdM A\c:pa"@@f̌_[QJM&6<0;s ^}.b3v3/ђq-a2"`1Ԣ>e6R ;詘)|o>aƵ ,96Q OԟeDo2a14K/QI"3g 7X QFb9g~O wl߾$8kNDa9~ @e@;v>ܓ%Ag~ 7zMM5ЀƆF!H XD0883Dqtvv 8T@;/>̳%Ymm3%}\x&Nf477eR3<:J#bŁwBww0$󭔌_ߍ={@2{@ /~,5.c; /<¬>Y>9fHcؽ ߡ|[ 2U۶m@k{ fO³ =lΚX,™wVSh_4ص{7^}5{c~Nx޾XPa٘ڊj:DGx ~uzu  % l +s#B+ 3ui8yK `>&Ǟ^ع{q=R_$ X'r {zUkjjp…8yʔw&];^x=xeU[Ǐpt}ヒ;wرcVBy'cb_`Fu}㿑<}4|ҥf3ҟSzp/~crh3RbH;,̨ŌiۋN ?u1|睧͟X5kra``_L9P[ƳGtuuzꩂ:KiJֳ֧j[X -Xi:2W?*_zR柷׹jkqх1RJx\U'8Ւd0TyȬp1c/hwb2{ e$ 7)XK y'553.EC}X2XJ0RJHcl]Ē!%Cr\?wH)쬳KfcE)Ri]{X,>E-XuU;9ZZZK.A"Qfa”Gt2>}Hi0=dm'H`cĉ1XsW\w\@&R9z*.XZ2˸HLEkYzkKK=g/S/a)Sl2N\vjh[B>JD1JϒY=)'c޼6)j+ygM@Waz0-YGHe˖pQ"qh~IhfX;chE& #:1mҷ̘ڊ 'MA|Ĩ#vN:i,iY.ѦV]^x18nN}27Hg"9R֤Up Wr*vZJ;3քK:jPG1qa9zP:sP1K"ΞJXQ!-*'Pl7>ox;Z꣏.. \ЃY:{6b&{ UW]U; )btu6f$jjjɶD9}K%&OAGQA-Pmd$2Q2 4Vuu58t~ Sl# /> պL?As wj>>j 쨷hWk"̊,NI'iCjҕW^9c@m(cqj" V3gV&Hv* i<%k+k{d7AJq! aGKg0<4(3ҖvdQ2s+vܡ.Zd0fL}r KꋆHޠƪ"7648`&3&uL H3A@% wB-#u0~|zsQ@ /_n ?ŠsTc8S1)ӥL ՓvX'L9bf[aͺE,6gn8;Jɓ'ÿR3|fYUe~6,@BܙQ;' %(3:]v/;S9̈vSp1@f]w"MaMcX ͓&|#M\2,'N.<5ͪ-pUmwęPu{~3~ðǏCYYYEGT$prKs .`Ʋ:\5XEXh]c ĞB%HwlDZ8a"ρ&_(,YQyD"1cxjt.kOjy^K]2F$6 * s1`)Ѐx<@A+WN(Hø@7D[4(ѲjU; dzV! a5:q)?`:ZRPcСC0̡kl* f U!dcc7' aCfxA EHp 0+%ЈÇgCL ZF/l764 /l_͚DPz!w&-f{%-]n(q (-)ls qa, n19S0UdA p:AN@t8o^ͣ;Q^iW5!dT;5 vnCY\=T8V`+W6E&e(N֦Wttv[Z&zrW .#ڈj:yo"!3uXϥt;C!lc)MՕp>r n "i'^ փqrCRT }lv^U5ftoW"Q%x2 Ov"-q-7Vi °}zVC.r+9̋ `+*+-$tqkLM g&Ҫ "!`xadYy9l!@s4tٲSPLXth|@XðA,AK6b1@ ðX, 8~7pM z'|<`BhA2!db+ j׾<| $,sҙ+wuuufxo߾T2)94tx8vӞӉ1m4-R;֓!_{g(L0ָG-۵>Rd=};9+ޜ0$iԎC"@==i3uF,%zzz"c 6gV>Q#ؾ"[ea^nE4mQɡ$; i9ӱc)D3KHDgg'*+*PUU DQF!&Av;c)BIA]eŋ' ,< Q]d8z֩v?L(X46 wfu) Y rs( z\8[$O;(D)^$Jt2E">aߛ)/2#2ǔos y}3a`` [ ;R><|aYhry ӝʊɡ|Ëav(uWD'rr!_]k +?aT }BfWvv^x~{ah"@VϗZ "zC;;64H= 8~* f\a^!z-2{ ¯b?u֝b a`2޻*": AVvopr?DE`݃Jxgd/A&(HxXXG5  KX/&ýODCXB '=  4ސ9v"YvBUwFu2WEk{$:J,Faǽ#XQ+eºBlɠ] , J</ÕݎX/}衇 :8ueY<u>3!Ǿ)'ni- ߯[V-㦓`( h`=P[(#IN~ D0v<:X &=GEGB7œe˖DUփ2r rin "z;>*Ef 1][(ZZ@~ Io /% B9Krќy"WMZW֬}G~ayQxiֈbqkY-/ؿo4Oi~3[լӬZ ]s.sͭ3[5VuºfUc\*58B.|`=ؽIܞo~~M=Гz& /n&U؎Sv<z? {s[iIxfϊ 4dn*vp"{= fZ\#oX/&1cӪUw@ez"S>v|xREA큾 6RttX߽㻩 憺߸FF|7mڸ@`lj 3@D5/#=<=F "{*2%ϭ073w2X|"rOBܲuo{tw-f;8`<~'!V]Qxo|R0 8/@or {0 $!Fi7 ѧ 11<;xsQٟ}AyYEag !$B]JeJjr(J@+{+[Cإo+Pge)Ie|~%-Orz]mix|l0a5H4Act 2ӔCɃɤ}8m۞d7jT~ڑ U r5 LF22O@AL "naFD.Μv18e:ޏ^wh8om?lVS!_dFOsnpQ|"0NN^k00!pO{\BP !|"|l{>6=z(c'B2SDA"LB/-g #(50y!Bl ??~r/, *pa.0D h=nboG$JIENDB`qstardict-0.12.9.orig/qstardict/pixmaps/download.png0000644000175000017500000002772211023552141021204 0ustar alexalexPNG  IHDR>asRGBbKGD pHYs B(xtIME "dJ IDATx}w}WU'l"O`ZlEPͤ'KSO9=K{-˲,$[ɲ(M sN<:U=3K 7ꗫTNZV0y|߁bR!u o8P`Ç.888h n˹&~?W㟱4NT ~W 4x @ף 8Z?$TӼ$q8PY]+( wuޫE~a1 pr<…Ýnkr$˯;x?888+l(7ʊKp)|8S;|?uѼgw^f&L:q *#2 y꛾ ]҃l.@ z-,#JUpˈ X,5yGYϣ;c[v&c,=( YK(FtGJ# ~*q9>v1 JIl x `Z90J)87)_g~o [ckҕe 8z 1d2 w!@V 3Nw !|.!HRuhfq# ,bqlfRNT(Ws~;ӺNs^HrG2?9p%/Mq֡MD/ ]..i@|1o BC&ܳ׽"v |]Wg"I 33ƳO=bi\x)&lMO&i% +(zceI? !W= Qe J ہej | nb rFh;]y)43#G<DH.5Y|&ћ`hK~^9 Z (q=Yh&'!1N* #Dê DmW4 Fy9l~F4\ qW Bp[oD[ J)@pbfj l -`$vR (sFF!|7#ݏt"'ZvDYڌpt(0y$ CC.Z91 I  Iw*;m !02k3 6Pt 9]&@A|ڕ@LNbzngLȲZ9ev(94U4۶~fg72=^<zϽ?@s +H!|v W ޕ~@Ta8Ǽ aX*K!ԻBH A@,(h/#_ð'tww\Xe;.Re pq3оr@Lxvi|a,1AZXO #=c~.۳5b{hz! [hlNm?>+ >0eDlE4r{s9Tu8R=7oWԁXb]Z깿{/0W{.ۃ6Lf‚DsD8pc݈'QG3|\pqG[&Yw.4@$I]7}a^?p@p"mn_Pڧ+Ѓ|XXxw<>8~g.}?Bֵk3PN<G7)!<޸gO' 2@y/">0f*3>Ek3Iw) iJู 3g}ON=MM vx>6Qࢍ 'Z+v^[5ǡC|N\q gO)(e MS֍;??p?^o-2O#," &F=o t =t= 0UZ>C?7ӹnhrSZ %+G۷_~oqgƾ[!g:ITy! "5 @+=瘭X Y}E{{qЫ \\M7]P>kZ|/ Ox aHt~=A;ptqDN;7d/a6|?~A4}^\;D%0F}AC7 cyw]ϾZ{,(=G×AرXX’"JU0 _Gxj1bCQ5S!DH !=租č~ǧaֲN ͏?"⊡S]@79hx 45`vrw`>/>?NfzVX`X:- Up܁|=O-q1'TT<TPPNA4"\@p><ߋ>N*_q; !$ G԰ 2?7sr_fnt =vo_8G}ͮa}EQ: g4K##Ŀ| Յk>ZH5N)i}tִdtg} ނo9-邯Ͽ7mޛI `}s?Ja^IY~ggcc7? Up |?.BSAhoιzW _*Fmz0r+|9T+,H y$;RyPJE(jJ%E44plHqWr7Ì; \(:auI%h.[-OfNTI!ÙP%} I_Hy4:%,s`vnK*GGQ3^y^ֵ=ϻebC#D$%F(d>i[(: ? \ tYAN%C72ij BS+'q0B@)E&(!%lIhP̿WewA0q Fu6Bx>!\"C^@$HL$;b"T{UU\JWX@Q7 4mbUN$Y(AkЖ3D@lZ2,a$}P|xN,7 oǍC` P_ @`& Ж'mά%~BR Ys\#/j(}5LB( Jmo.Hh3Im۠:.|1;|d +2PUBFy勶]K1J 3|^ d9 C'<'`$y0tsw,C4Y&epcrC[n D$P1`Z|(G<_24) o--!A30kmC&?WRmo)Q h8N3JKvt @ڦPHVf09 h$$~OBHQ8ZlCw11TD6kaRfQG5CA _"$=ko+#ddr(7jAncV8!H 0r\DHX Tbt0 PFN:yS8PARF&RS9bC3Gepln b)`~n0֑ؤng/G9)[Go:1 b8OByʨ#Hi ׉ % #x =R@_ThB^8ΗrObH1@Jry ss\V x~Y6i[2hLg,l阞`~Гޢ@ 9KzӼV#p;5M'Yxӛv\WP'ZoSś[\Dqdrv(Q)"y|Zyy@)gbfnp\^J(!`B ]CX5,TX"0Bk'0[3tE 9!`n xȌ1G:5C<""ضZT4F@f0\"Țrj-Q^{m^x>&g09U` 4UFPu:. :P PL7E=i{#ȭ F)V&0: 0t]v)sN (@3>$$ ǦMcCER,ҜooS kL&Wku4D'1}X3æBX{W0!$˲2S>"fãsK(W*$@U)//K jw^pg[M9qjiP )/Zӄ ɸ@ͤ\+|PUT/A>B'Oq]P d [(r3'M <ɱXB\JZVwEiKZ~y/xNsBcA{Bc<G$EJ~0^u B+a\ű%pR1Y2bΌb plF,RBNU" *n@J<F@QǶ] زQ̙Y:-bRomDJ*J9Zy84%xo|lr [r[<~FIDAT99zq g_b &2$F1>`Lrf I{'g"uBU% ]B%zᴼdp-Q#]Be:|9MJK3 &5ܷxF\RyuG$ %WHy:7(!tS*'qaə2Ϗyڒ[DrL3HD}!b9YaHx󆡯Ǔ>@~ar3at0QC1o7Q]T6*5 O4PB`h ]L+u[B#֍vE:~/ck\y啪msU7LC@r\q<O1X`+ ]1z>v=8 E%A4EHP|rslK(I1%Rgh7X)$M\.b JXeۇ 'A7, ,wDGg8:Seh0Q̙Q,1ClT<e9|.y0c`@ DSu XzRF"$=uq{a7`b1hˆ`1R`_<3՗|1f[6vU E.m82CSȚYnzI$1vvՆj-7o7IalMI2{ p9gBG}\t`{#(]v.뮻U$J եEq; K by G`d$> sf;ΔAR 5@)I"+ps>>?'( bƍ4>RLk KGSVGKt/:~iKޔ)D\|T@p 0؍vsV4[4]hɲ2p(3vnbʱ*g8MoWP_gP|3fq667Bp/A(0i81EN;}UkBDLe992ϮIC' dbi3@g6ɒ%ҥIY/zA3U* "Z^ ̑a3%DvˠO,mvZ}I{-õѮWAzhi>vDݔvXYK$ذa8i)ގQK:~Q mI1T}t{,R")M:"`aN@z@Ȑ(eDɴ,lvMѝzA7ݛ);Z)"nx,S.y4c<&Jϭ)(EB(8Ey}8tt4ENaٺi Bl\SB $ |wv8G09=Wl' ,IR{"Xt9q<'(v8\  ۅB>CI$fRi1vCf5+zMNArHkH|;̓@:a͉.$:i 9^j (ju瞎Ii|jԬd뚓!)_6"ħ%{}Q5!cD`be,H,[fvIբI) ( <^-`m0v$qlXV6R0h[g0c#=^K\Hl12\ pV>|}mA$_ W7wݰ,Z)k@~=4 %[UY&} %]]Mb5["q!\E(LsH{lTfck:D!$p/o}n\;q-TcwYl\>QR)]ns뵚,KGL_G)r9GQs,'\2v"3niI,ό+uL.Oެl43LLL /c~ oG)W݋wa7}7izMUˣwi0 #T\x+ hgoI :2l5md 1 3D@.:n@sqq[ŋژ/aƚ7 `Ҟ~8 |HG(}z 8ת +LSA.ö9u nDJK Ìwڨ ]7㖳HJqռ0eqYb8g?!C[C%7Up]5ޓJn/F)&AXhqTȳ06}8BP,;VrEٝI,nhKR>%ryHCQ(I(*$IȐeI:L> BPA @>|_ $ё44 !p ([Rk9g,iT 9@2P>Tfaz>{>$ǭS;o??;/_\ڶ!$=چ͑H׫ɄVZnI)D~._Wų<xDއz޹r6FU/'+ O♧`X]Y$}wmV.'V+7(>H~ x,3&MBW'F-#IENDB`qstardict-0.12.9.orig/qstardict/mainwindow.cpp0000644000175000017500000001644011023552142020062 0ustar alexalex/***************************************************************************** * mainwindow.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "mainwindow.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include "dictcore.h" #include "application.h" #include "popupwindow.h" #include "settingsdialog.h" namespace QStarDict { MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { setupUi(this); m_dict = 0; translationView->setDict(m_dict); menu_File->insertActions(actionQuit, translationView->toolBar()->actions()); menu_Options->insertAction(menu_Options->actions().first(), wordsListDock->toggleViewAction()); createConnections(); loadSettings(); } MainWindow::~MainWindow() { saveSettings(); } void MainWindow::showTranslation(const QString &text) { searchBox->setText(text); on_queryButton_clicked(); } void MainWindow::createConnections() { connect(actionAboutQt, SIGNAL(triggered()), qApp, SLOT(aboutQt())); connect(actionQuit, SIGNAL(triggered()), qApp, SLOT(quit())); actionScan->setChecked(Application::instance()->popupWindow()->isScan()); connect(actionScan, SIGNAL(toggled(bool)), Application::instance()->popupWindow(), SLOT(setScan(bool))); connect(Application::instance()->popupWindow(), SIGNAL(scanChanged(bool)), actionScan, SLOT(setChecked(bool))); connect(wordsList, SIGNAL(itemActivated(QListWidgetItem*)), SLOT(wordsListItemActivated(QListWidgetItem*))); connect(wordsList, SIGNAL(itemClicked(QListWidgetItem*)), SLOT(wordsListItemActivated(QListWidgetItem*))); connect(translationView, SIGNAL(wordTranslated(const QString&)), SLOT(wordTranslated(const QString&))); } void MainWindow::loadSettings() { QSettings config; restoreGeometry(config.value("MainWindow/geometry", QByteArray()).toByteArray()); restoreState(config.value("MainWindow/state", QByteArray()).toByteArray()); setVisible(config.value("MainWindow/visible", true).toBool()); wordsListDock->setFloating(config.value("MainWindow/wordsListDock/floating", wordsListDock->isFloating()).toBool()); wordsListDock->setGeometry(config.value("MainWindow/wordsListDock/geometry", wordsListDock->geometry()).toRect()); setInstantSearch(config.value("MainWindow/instantSearch", true).toBool()); setDefaultStyleSheet(config.value("MainWindow/defaultStyleSheet", defaultStyleSheet()).toString()); } void MainWindow::saveSettings() { QSettings config; config.setValue("MainWindow/geometry", saveGeometry()); config.setValue("MainWindow/state", saveState()); config.setValue("MainWindow/visible", isVisible()); config.setValue("MainWindow/wordsListDock/floating", wordsListDock->isFloating()); config.setValue("MainWindow/wordsListDock/geometry", wordsListDock->geometry()); config.setValue("MainWindow/instantSearch", m_instantSearch); config.setValue("MainWindow/defaultStyleSheet", defaultStyleSheet()); } void MainWindow::on_actionAbout_triggered() { QMessageBox::about(this, tr("About QStarDict"), tr("QStarDict %1 - Qt version of StarDict
    ").arg(QSTARDICT_VERSION) + tr("Copyright (C) 2007 Alexander Rodin " "http://qstardict.ylsoftware.com")); } void MainWindow::on_actionSettings_triggered() { SettingsDialog dialog(this); dialog.exec(); } void MainWindow::on_queryButton_clicked() { if (searchBox->text().simplified().isEmpty()) { setWindowTitle(tr("QStarDict")); translationView->clear(); wordsList->clear(); return; } wordsList->clear(); wordsList->addItems(m_dict->findSimilarWords(searchBox->text())); translationView->translate(searchBox->text()); } void MainWindow::reload() { wordsList->clear(); wordsList->addItems(m_dict->findSimilarWords(translationView->translatedWord())); translationView->reload(); } void MainWindow::queryEdited(const QString &) { if (m_queryTimer) killTimer(m_queryTimer); m_queryTimer = startTimer(200); } void MainWindow::timerEvent(QTimerEvent *event) { if (event->timerId() == m_queryTimer) { killTimer(m_queryTimer); m_queryTimer = 0; on_queryButton_clicked(); } else QMainWindow::timerEvent(event); } void MainWindow::wordTranslated(const QString &word) { if (word.simplified().isEmpty()) setWindowTitle(tr("QStarDict")); else setWindowTitle(tr("%1 - QStarDict").arg(word)); if (m_queryTimer) { killTimer(m_queryTimer); m_queryTimer = 0; } } void MainWindow::wordsListItemActivated(QListWidgetItem *item) { searchBox->setText(item->text()); translationView->translate(item->text()); setWindowTitle(tr("%1 - QStarDict").arg(translationView->translatedWord())); } void MainWindow::setInstantSearch(bool instantSearch) { if (instantSearch == m_instantSearch) return; m_instantSearch = instantSearch; if (m_instantSearch) connect(searchBox, SIGNAL(textEdited(const QString&)), SLOT(queryEdited(const QString&))); else disconnect(searchBox, SIGNAL(textEdited(const QString&)), this, SLOT(queryEdited(const QString&))); } void MainWindow::setDict(DictCore *dict) { m_dict = dict; translationView->setDict(dict); } void MainWindow::keyPressEvent(QKeyEvent *event) { if (event->text().size() || event->key() == Qt::Key_Escape) { if (! searchBox->hasFocus()) { searchBox->setText(event->text()); searchBox->setFocus(Qt::OtherFocusReason); } if (event->key() == Qt::Key_Escape) searchBox->clear(); } QMainWindow::keyPressEvent(event); } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-0.12.9.orig/qstardict/dictbrowser.cpp0000644000175000017500000001063111023552142020231 0ustar alexalex/***************************************************************************** * dictbrowser.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "dictbrowser.h" #include #include #include #include #include #include #include namespace { const QString translationCSS = "body {\n" "font-size: 10pt; }\n" "font.dict_name {\n" "color: blue;\n" "font-style: italic; }\n" "font.title {\n" "font-size: 16pt;\n" "font-weight: bold; }\n" "font.explanation {\n" "color: #7f7f7f;\n" "font-style: italic; }\n" "font.abbreviature {\n" "font-style: italic; }\n" "font.example {\n" "font-style: italic; }\n" "font.transcription {\n" "font-weight: bold; }\n"; } namespace QStarDict { DictBrowser::DictBrowser(QWidget *parent) : QTextBrowser(parent), m_dict(0), m_highlighted(false) { document()->setDefaultStyleSheet(translationCSS); } QVariant DictBrowser::loadResource(int type, const QUrl &name) { if (type == QTextDocument::HtmlResource && name.scheme() == "qstardict") { QString str = name.toString(QUrl::RemoveScheme); QString result = m_dict->translate(str); if (result.isEmpty()) result = "
    " + tr("The word %1 is not found.").arg(str) + "
    "; return "Translation for \"" + str + "\"\n" + "" + result + ""; } return QTextBrowser::loadResource(type, name); } void DictBrowser::mouseMoveEvent(QMouseEvent *event) { if (m_highlighted) { m_oldCursor.setCharFormat(m_oldFormat); m_highlighted = false; } if (event->modifiers().testFlag(Qt::ControlModifier)) { QTextCursor cursor = cursorForPosition(event->pos()); cursor.select(QTextCursor::WordUnderCursor); QString selection = cursor.selection().toPlainText().simplified(); if (m_dict->isTranslatable(selection)) { m_oldCursor = cursor; m_oldFormat = cursor.charFormat(); QTextCharFormat format = m_oldFormat; format.setForeground(Qt::blue); format.setFontUnderline(true); cursor.setCharFormat(format); m_highlighted = true; } } QTextBrowser::mouseMoveEvent(event); } void DictBrowser::mousePressEvent(QMouseEvent *event) { if (event->modifiers().testFlag(Qt::ControlModifier)) { QTextCursor cursor = cursorForPosition(event->pos()); cursor.select(QTextCursor::WordUnderCursor); QString selection = cursor.selection().toPlainText().simplified(); if (m_dict->isTranslatable(selection)) { setSource(selection); if (m_highlighted) m_highlighted = false; } } QTextBrowser::mousePressEvent(event); } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-0.12.9.orig/qstardict/qstardict.rc0000644000175000017500000000011011023552142017511 0ustar alexalexIDI_ICON1 ICON DISCARDABLE "pixmaps/qstardict.ico" qstardict-0.12.9.orig/qstardict/dbusadaptor.h0000644000175000017500000000564611023552142017671 0ustar alexalex/***************************************************************************** * dbusadaptor.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef DBUSADAPTOR_H #define DBUSADAPTOR_H #include namespace QStarDict { class MainWindow; /** * The DBusAdaptor class represents and QStarDict D-Bus interface. */ class DBusAdaptor: public QDBusAbstractAdaptor { Q_OBJECT Q_CLASSINFO("D-Bus Interface", "org.qstardict.dbus") /** * The main window visible property. */ Q_PROPERTY(int mainWindowVisible READ mainWindowVisible WRITE setMainWindowVisible) public: /** * Construct a DBusAdaptor. */ DBusAdaptor(MainWindow *mainWindow); /** * Return true if main window is visible, otherwise return * false. */ bool mainWindowVisible() const; /** * Set visible state of main window. */ void setMainWindowVisible(bool visible); public slots: /** * Show main window with translation of text. */ void showTranslation(const QString &text); /** * Show popup window with translation of text. */ void showPopup(const QString &text); /** * Return a translation of text in plain text format. */ QString translate(const QString &text); /** * Return a translation of text in HTML format. */ QString translateHtml(const QString &text); private: MainWindow *m_mainWindow; }; } #endif // DBUSADAPTOR_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-0.12.9.orig/qstardict/popupwindow.cpp0000644000175000017500000001111611023552142020274 0ustar alexalex/***************************************************************************** * popupwindow.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "popupwindow.h" #include #include #include #include #include "dictwidget.h" #include "keyboard.h" #include "selection.h" #include "application.h" #include "speaker.h" namespace QStarDict { PopupWindow::PopupWindow(QWidget *parent) : ResizablePopup(parent) { m_dict = 0; translationView = new DictWidget(this); translationView->setFrameStyle(QFrame::NoFrame); translationView->setDict(m_dict); translationView->setMouseTracking(true); QGridLayout *mainLayout = new QGridLayout(this); mainLayout->setMargin(0); mainLayout->addWidget(translationView); m_selection = new Selection(this); connect(m_selection, SIGNAL(changed(const QString&)), this, SLOT(selectionChanged(const QString&))); loadSettings(); } PopupWindow::~PopupWindow() { saveSettings(); } void PopupWindow::loadSettings() { QSettings config; setScan(config.value("PopupWindow/scan", true).toBool()); setModifierKey(config.value("PopupWindow/modifierKey", 0).toInt()); setShowIfNotFound(config.value("PopupWindow/showIfNotFound", false).toBool()); setWindowOpacity(config.value("PopupWindow/opacity", 1.0).toDouble()); setTimeoutBeforeHide(config.value("PopupWindow/timeoutBeforeHide", 500).toInt()); setDefaultSize(config.value("PopupWindow/defaultSize", QSize(320, 240)).toSize()); setPronounceWord(config.value("PopupWindow/pronounceWord", true).toBool()); setDefaultStyleSheet(config.value("PopupWindow/defaultStyleSheet", defaultStyleSheet()).toString()); } void PopupWindow::saveSettings() { QSettings config; config.setValue("PopupWindow/scan", isScan()); config.setValue("PopupWindow/modifierKey", m_modifierKey); config.setValue("PopupWindow/showIfNotFound", m_showIfNotFound); config.setValue("PopupWindow/opacity", windowOpacity()); config.setValue("PopupWindow/timeoutBeforeHide", timeoutBeforeHide()); config.setValue("PopupWindow/defaultSize", defaultSize()); config.setValue("PopupWindow/pronounceWord", pronounceWord()); config.setValue("PopupWindow/defaultStyleSheet", defaultStyleSheet()); } void PopupWindow::setScan(bool scan) { m_selection->setScan(scan); emit scanChanged(scan); } bool PopupWindow::isScan() const { return m_selection->isScan(); } void PopupWindow::setDict(DictCore *dict) { translationView->setDict(dict); m_dict = dict; } void PopupWindow::selectionChanged(const QString &text) { if (m_modifierKey && ! Keyboard::activeModifiers().testFlag(static_cast(m_modifierKey))) return; showTranslation(text); } void PopupWindow::showTranslation(const QString &text) { QString simpl = text.simplified(); simpl.remove(QRegExp("[&%-/+?\\*#!:\\(\\)\\[\\]]+")); if (simpl.isEmpty()) return; bool isFound = m_dict->isTranslatable(simpl); if (m_showIfNotFound || isFound) { translationView->translate(simpl); translationView->clearHistory(); popup(); if (isFound && m_pronounceWord) Application::instance()->speaker()->speak(simpl); } } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-0.12.9.orig/qstardict/dbusadaptor.cpp0000644000175000017500000000507511023552142020220 0ustar alexalex/***************************************************************************** * dbusadaptor.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "dbusadaptor.h" #include #include "application.h" #include "mainwindow.h" #include "popupwindow.h" namespace QStarDict { DBusAdaptor::DBusAdaptor(MainWindow *mainWindow) : QDBusAbstractAdaptor(mainWindow), m_mainWindow(mainWindow) { QDBusConnection connection = QDBusConnection::sessionBus(); connection.registerService("org.qstardict.dbus"); connection.registerObject("/qstardict", mainWindow); } bool DBusAdaptor::mainWindowVisible() const { return m_mainWindow->isVisible(); } void DBusAdaptor::setMainWindowVisible(bool visible) { m_mainWindow->setVisible(visible); } void DBusAdaptor::showTranslation(const QString &text) { m_mainWindow->showTranslation(text); } void DBusAdaptor::showPopup(const QString &text) { Application::instance()->popupWindow()->showTranslation(text); } QString DBusAdaptor::translate(const QString &text) { return Application::instance()->dictCore()->translate(text); } QString DBusAdaptor::translateHtml(const QString &text) { return Application::instance()->dictCore()->translate(text); } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-0.12.9.orig/qstardict/dictbrowser.h0000644000175000017500000000521111023552142017674 0ustar alexalex/***************************************************************************** * dictbrowser.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef DICTBROWSER_H #define DICTBROWSER_H #include #include #include #include "dictcore.h" namespace QStarDict { /** * The DictBrowser widget provides view of translations from given dictionary. */ class DictBrowser: public QTextBrowser { Q_OBJECT public: /** * Construct empty DictWidget. */ DictBrowser(QWidget *parent = 0); /** * Set source dictionary. * Warning: DictBrowser will copy only a pointer to dict. So set dictionaries * allocated from heap and don't destroy it befor DictWidget. */ void setDict(DictCore *dict) { m_dict = dict; } /** * Return pointer to dictionary. */ const DictCore* dict() const { return m_dict; } QVariant loadResource(int type, const QUrl &name); protected: void mouseMoveEvent(QMouseEvent *event); void mousePressEvent(QMouseEvent *event); private: DictCore *m_dict; QTextCursor m_oldCursor; QTextCharFormat m_oldFormat; bool m_highlighted; }; } #endif // DICTBROWSER_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-0.12.9.orig/qstardict/keyboard.h0000644000175000017500000000344611023552142017155 0ustar alexalex/***************************************************************************** * keyboard.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef KEYBOARD_H #define KEYBOARD_H #include namespace QStarDict { /** * The Keyboard class is a representation. */ class Keyboard { public: /** * Return active keyboard modifiers. */ static Qt::KeyboardModifiers activeModifiers(); }; } #endif // KEYBOARD_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-0.12.9.orig/qstardict/dictplugin.h0000644000175000017500000002222711023552142017515 0ustar alexalex/***************************************************************************** * dictplugin.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef DICTPLUGIN_H #define DICTPLUGIN_H #include #include #include #include namespace QStarDict { /** * This is a base class for all dictionary plugins classes. */ class DictPlugin { public: /** * This enum describes a features of dictionary plugin. */ enum Feature { /** * No features. */ None = 0x00, /** * Dictionary plugin can search for similar words using * fuzzy algoritms. */ SearchSimilar = 0x01, /** * Dictionary plugin has a settings dialog. */ SettingsDialog = 0x02, }; Q_DECLARE_FLAGS(Features, Feature) /** * This class represents information about dictionary. */ class DictInfo { public: /** * Construct empty DictInfo object. */ DictInfo() : m_wordsCount(-1L) { } /** * Construct DictInfo object from data. * @param plugin A plugin name * @param name A dictionary name * @param author A dictionary author * @param desription A dictionary description * @param wordsCount A count of words that available in dictionary */ DictInfo(const QString &plugin, const QString &name, const QString &author = QString(), const QString &description = QString(), long wordsCount = -1L) : m_plugin(plugin), m_name(name), m_author(author), m_description(description), m_wordsCount(wordsCount) { } const QString &plugin() const { return m_plugin; } const QString &name() const { return m_name; } const QString &author() const { return m_author; } const QString &description() const { return m_description; } long wordsCount() const { return m_wordsCount; } void setPlugin(const QString &plugin) { m_plugin = plugin; } void setName(const QString &name) { m_name = name; } void setAuthor(const QString &author) { m_author = author; } void setDescription(const QString &description) { m_description = description; } void setWordsCount(long wordsCount) { m_wordsCount = wordsCount; } private: QString m_plugin; QString m_name; QString m_author; QString m_description; long m_wordsCount; }; /** * This class represent a translation. */ class Translation { public: /** * Construct an empty translation. */ Translation() { } /** * Construct a translation from data. * @param title A translation title * @param dictName A full dictionary name * @param translation A translation */ Translation(const QString &title, const QString &dictName, const QString &translation) : m_title(title), m_dictName(dictName), m_translation(translation) { } /** * Return the translation title. */ const QString &title() const { return m_title; } /** * Return the dictionary name. */ const QString &dictName() const { return m_dictName; } /** * Return the translation. */ const QString &translation() const { return m_translation; } /** * Set a translation title. */ void setTitle(const QString &title) { m_title = title; } /** * Set a dictionary name. */ void setDictName(const QString &dictName) { m_dictName = dictName; } /** * Set a translation. */ void setTranslation(const QString &translation) { m_translation = translation; } private: QString m_title; QString m_dictName; QString m_translation; }; /** * Destructor. */ virtual ~DictPlugin() { } /** * Return the plugin name. */ virtual QString name() const = 0; /** * Return the plugin version. */ virtual QString version() const = 0; /** * Return the plugin description. */ virtual QString description() const = 0; /** * Return the plugin authors. */ virtual QStringList authors() const = 0; /** * Return a features supported by dictionary plugin. */ virtual Features features() const { return Features(None); } /** * Return a list of available dictionaries. */ virtual QStringList availableDicts() const = 0; /** * Return a list of loaded dictionaries. */ virtual QStringList loadedDicts() const = 0; /** * Set a list of loaded dictionaries. */ virtual void setLoadedDicts(const QStringList &loadedDicts) = 0; /** * Return true if translation exists in dictionary, * otherwise returns false. */ virtual bool isTranslatable(const QString &dict, const QString &word) = 0; /** * Return translation for word from dictionary. If word not found * returns empty string. */ virtual Translation translate(const QString &dict, const QString &word) = 0; /** * Return a list of similar to "word" words from all loaded dictionaries. * Works only if SearchSimilar feature is enabled. */ virtual QStringList findSimilarWords(const QString &dict, const QString &word) { Q_UNUSED(dict); return QStringList(word); } /** * Return an information about dictionary. The dictionary may be not loaded * but available. */ virtual DictInfo dictInfo(const QString &dict) = 0; /** * Run a settings dialog and return QDialog::DialogCode. */ virtual int execSettingsDialog(QWidget *parent = 0) { Q_UNUSED(parent); return 0; } protected: /** * Return a directory that contains plugin's data. */ QString workPath() const { QString path = QDir::homePath() + "/.qstardict/pluginsdata/" + name(); if (! QDir::root().exists(path)) QDir::root().mkpath(path); return path; } }; Q_DECLARE_OPERATORS_FOR_FLAGS(DictPlugin::Features) } Q_DECLARE_INTERFACE(QStarDict::DictPlugin, "org.qstardict.DictPlugin/1.0") #endif // DICTPLUGIN_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent qstardict-0.12.9.orig/qstardict/main.cpp0000644000175000017500000000540111023552142016625 0ustar alexalex/***************************************************************************** * main.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "application.h" #ifdef Q_OS_UNIX #include #include #include #include #include #elif defined(Q_OS_WIN) // Q_OS_UNIX #include #endif // Q_OS_WIN #ifdef QSTARDICT_WITH_TRANSLATIONS #include #include #endif // QSTARDICT_WITH_TRANSLATIONS int main(int argc, char *argv[]) { #ifdef Q_OS_UNIX QSettings lockFile(QDir::homePath() + "/.qstardict/qstardict.pid", QSettings::IniFormat); QString lastPid = lockFile.value("LastStart/pid").toString(); if (lastPid.length() && QDir("/proc/" + lastPid).exists() && lockFile.value("LastStart/time").toDateTime() == QFileInfo("/proc/" + lastPid).created()) { qDebug("qstardict: already running"); return 0; } lockFile.setValue("LastStart/pid", getpid()); lockFile.setValue("LastStart/time", QFileInfo("/proc/" + QString::number(getpid())).created()); lockFile.sync(); #elif defined(Q_OS_WIN) // Q_OS_UNIX int hMutex = CreateMutex(NULL, true, "qstardict"); if (GetLastError == ERROR_ALREADY_EXISTS) { MessageBox(0, "Warning", "QStarDict is already running", MB_ICONWARNING); return 0; } #endif // Q_OS_WIN QStarDict::Application app(argc, argv); return app.exec(); } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-0.12.9.orig/qstardict/cssedit.h0000644000175000017500000000530111023552142017003 0ustar alexalex/***************************************************************************** * cssedit.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef CSSEDIT_H #define CSSEDIT_H #include "ui_cssedit.h" #include namespace QStarDict { /** * CSS styles editor. */ class CSSEdit: public QWidget, private Ui::CSSEdit { Q_OBJECT public: /** * Constructor. */ CSSEdit(QWidget *parent = 0); /** * Set CSS style for editing. */ void setCSS(const QString &css); /** * Returns edited CSS style. */ QString css() const; /** * Set aliases for elements. */ void setElementsAliases(const QHash &aliases); /** * Returns elements aliases. */ const QHash &elementsAliases() const { return m_elementsAliases; } private slots: void colorSelectClicked(); void setCurrentElement(int index); void propertyChanged(); private: typedef QHash Element; void updateElementCombo(); void updatePreview(); Element getParentElement(const QString &elementName); QHash m_elements; QHash m_elementsAliases; QString m_currentElement; }; } #endif // CSSEDIT_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent qstardict-0.12.9.orig/qstardict/settingsdialog.h0000644000175000017500000000514111023552142020367 0ustar alexalex/***************************************************************************** * settingsdialog.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef SETTINGSDIALOG_H #define SETTINGSDIALOG_H #include #include "ui_settingsdialog.h" #include "dictcore.h" class QStandardItemModel; class QStandardItem; namespace QStarDict { class MainWindow; /** * The settings dialog. */ class SettingsDialog: public QDialog, private Ui::SettingsDialog { Q_OBJECT public: /** * Construct new SettingsDialog widget with parent MainWindow. */ SettingsDialog(QWidget *parent = 0); void accept(); void reject(); private slots: void on_dictsMoveUpButton_clicked(); void on_dictsMoveDownButton_clicked(); void on_dictsShowInfoButton_clicked(); void on_pluginsShowInfoButton_clicked(); void on_pluginsConfigureButton_clicked(); void pluginsItemChanged(QStandardItem *item); private slots: void loadDictsList(); void loadPluginsList(); private: QStringList m_oldPlugins; QList m_oldDicts; QStandardItemModel *m_dictsModel; QStandardItemModel *m_pluginsModel; }; } #endif // SETTINGSDIALOG_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-0.12.9.orig/qstardict/qstardict.png0000644000175000017500000002172211023552142017705 0ustar alexalexPNG  IHDR>abKGD pHYs B(xtIME "5 r IDATx}{$Gy/{ٳ;YVvV>;O@ |!c;|;y?csA|p6ƁXzއ}_UUYYY5v*~^^^^^^^XNy't~7m{;n~ (D?$]:{!Np ဈ@j>y@q["sowD<At^g :U3 qksW}~[rƏrlJ=B/zEDVgQƎH'uʢJ@\h[XNX= <\WQ9N .>?sGZGmfK,~p,@)sQVŅ>\J4nt>5V D}@qAty'lT,:c8hv;VoY٩[;hMkׄ״55:8zk ~K<~ dm]\G;}k199iM=&7\qtYȏ\dcff=k(w]7vM<b"a\~1Q,LU }b1V.:ep]7& ew'v^Z .C\;n1p C=nvIMo `R"B)G묇, 2Q{0Q2S:+@y;XTe +ꕟjyCGdS@Y\|Bn03pΛ=P1 0 8v>яC\ M%D 3Y@:߬Nt^6e#bz~0NNYJh.`eeѣG裏vT&tdd j*nxyN8qpsKJKjb8( aKq0}S "yb!v N p0Y@ |͘ RFc@}ށ}D`l6 2 P('."bB!#N>pAt" xK $mBqYPCrAAD=mcM|v4iN)ZtezXpj eFyK8<ٜ#voX$VR(NzSŽ}88m լq9\'v:_>L?xphup:cc#Uz6s8(m '&w\fi<(?J&}j1;H\rCk]2{vS{iN<pQ6EN{W:1_.B>F "x%>E)}\J „Ͽ`v^D P.<=]ߥ"0;"pU})gI>$|MS'pǮ灛f<}Am)luju&whVOw@fl]Sה`iqWZp] ,pK@6q}ާ6T *o Sr 0Z#NRwg ! 9!""pfxMPXM b{H  u׋-q`e|]QWG$nyc'p h 8VDn,&[,@uY^iBi:pfQ!Z wĽcV`*ۦ@9 EvܐA'-Bħ//RFخTĶϨЁ@U:A8s y5Pv!YVqلb[d߹ \XL%aAm}.ZdzLܙ@bb! $98 nV8tCvJ58}t_b66 TGd9Dv`vXn8QFخ`"\Z=1`h\ L#` YA!t/qJ`/o!#ÖBX \Z=?rvϺٵŖ<WC+NWZA1& cl u.l"NTD DJ0ok}/X}a x8c*ohR̕@$oTLh@LAb53:TQ#9 FE "E& Yk 0:U [: ^s9`#P8!tE{َGXgqSCl?6me" W03̇ͪ-bj.0 =_\_ A^q2)j (*,3eTLaʰL/ v\Vq(bEr{5T. K. jDQf kuՏW W* S ب ȡZvk$hDZ@GFr">YIbr7՚#H%>LNN9 lDp Ж J~F uam̌u⍕rp=9ņ\&#\ZnN]#"t hE48*@!o ~ӢY6&Pc2Pv *tmϜ}[phc(QITh V` T`,!h@6}3& 5潸{sy9:|G^pI<,ΜGt9Jm͎ O,(6Ja*@'+ l#`f!ɓzc>MbN88 k4='?>mxIToU9ܻy '? _BF3F# 6(^FBW5'>pN;dPBv O Ke`vCGƀs%ށ~mxIvv߅Oq)e+lpS1A}Y.YiۥU0jtU`϶x6Z;~jqBnzz )#1Ĺ#ōq%*I1NjbЛWpqEҶ+-B=%H|au]u҇KKKkJ%y^X9=jwVޥACi $0MD \?_Su9_y4X,>:v 8fP&lRQ||ӂ1%`̝T+e/\~ltnScH6JOcKw#j{b:rGg療te70WpU x#G$ڵ }jI +% NfldO R}5K2>JkR/+>ݷ!-wM)l@ f6x7T4'uXf d3YpzLkv`qeXrd8|G|+qRgѸ<5j4V+@ 'u,I$b\5]o c\EWk7Qm{)\4##+̪i[XV nRxry&/RN-<$X.ߏ? 1ӈ[\,~w VFXf r dI+^l޸f z8?zz2BP2$L7)uJeBYPk WpäӢɊ KMӏhow^T:{U al#L MiQVQ YBMv< kb!UgޯZb-paC  j#>,2538.׀r/* \_r1\Z@ou x2֓$U_f:73k q~M:L4y 0 ;u_}:[ڀJCp;&tn*Ev߲pNk"q H`I nh$"WrDZ/FT+@&NP)O19_Yʖl6g".Uາ-_1f Y3*ūQfodlE,G&OS v`bbB{sN2( c@H |>rSQlm[aqrWv.@"dA%42eID8~ /\@f!\1(mgs}C_y([\# GYWy><&}~Gm\?2D< 'p@Y0\ F̰I2u\0VKD?1Y8}.P.IdzڛfY B;B(4|}9Kpp8nމ177g>o~3/_'0TM_ 43YAy~CYD 犺1njoPr`[~~Gމr9m|SC&fnH\J[7 X5-G|f)h XY&")T݀*P_Aq>&'~ RXO0sGL{. S [} {àMkUAW$M5lḱJچ"E#|n{o=fyرcGzxg羉Ca(tOT}P(AIà_Med B\Adk 텟;_7ŷtkbI_Em=ɦ QV1]FZܜqx2og_],Ƕp=kĤA wJʤN W|/m܀n< 4 "*{ߔyB7п3/--'FsLݲr5E)@; buJP(-8I"D~2pfV.(ZvZ zp3z4Z#Ý^ZO\,ҢaEt@잀`<`mF%#(?:=W7lő @n dnRwP&T0r[֤H& \F kTX@+@#7qTIsOdj'C)QD3+?tY.@r@55 5ԣY%']D'` QDOUxxc!OP{XRA(.hT@԰OV5 MJbS$DBڪ"nd4ֈ$žߔɯֹD椉5A1Ƭʂ=z9aaHP7EdP:Xh0q~dAߛRH\5jK*84܃Ilχn :[Nx9 ٔ0ж0ihgJOVEL rjMSJx)!3v[ fCmt  6 %y_'{q»3$Gzo#Kn!zN +Id$>Bt4룷d4* [ p@IӐ*Ū t( (m 5R 1`d}h,{U. l`tE'==Hq 6a,Y 9IZUՊɊA0L5X297B?}l ohR7zwL]S| p)\,9 ` ]Hg)ޏ&T JO-#8)n@ [U K8HЃ-dA책iɫ<OI$*B҆{*Dٕ1>dO 8n0E?Ŏh|?6%]fi(``|(E\>>eIzXnw}8ro-lUS/cH9r0kMnD%r,RƱ!_PsD?,"0=+|;`$ȤJZ ʿe(Vg@ӹD"H 9Y,C}cG|TNs8瓲Ol.4H^j'qűTLID%c$`قր"aG=YjebƠ&bFt* 0{U7EdPV$SIDAT1,dܫ. RHIcX20iF"M$ )ט,Fc;߳z~^ wzu_ 6 qKtg˳e; 8ޓ;>5Z]"'Xߔ}jT,yYT B"_S֎ŐێeY9M^0c\ݦ}.qJ&aLf?M̠iO&ɦȟ|SUT uCIENDB`qstardict-0.12.9.orig/qstardict/dictwidget.h0000644000175000017500000000716411023552142017505 0ustar alexalex/***************************************************************************** * dictwidget.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef DICTWIDGET_H #define DICTWIDGET_H #include #include "dictcore.h" #include "dictbrowser.h" class QToolBar; class QAction; namespace QStarDict { /** * The DictBrowser widget provides view of translations from given dictionary. */ class DictWidget: public QFrame { Q_OBJECT public: /** * Construct empty DictWidget. */ DictWidget(QWidget *parent = 0, Qt::WindowFlags f = 0); /** * Set source dictionary. * Warning: DictWidget will copy only a pointer to dict. So set dictionaries * allocated from heap and don't destroy it befor DictWidget. */ void setDict(DictCore *dict) { m_translationView->setDict(dict); } /** * Return pointer to dictionary. */ const DictCore* dict() const { return m_translationView->dict(); } /** * Clear translation text. */ void clear() { m_translationView->clear(); } /** * Clear history. */ void clearHistory() { m_translationView->clearHistory(); } /** * Show translation of str. */ void translate(const QString &str); /** * Return last translated word. */ QString translatedWord() const { return m_translationView->source().toString(QUrl::RemoveScheme); } /** * Return toolbar. */ QToolBar *toolBar() { return m_toolBar; } void setDefaultStyleSheet(const QString &css); QString defaultStyleSheet() const { return m_translationView->document()->defaultStyleSheet(); } void reload() { m_translationView->reload(); } signals: /** * Emits when translated word is shown. */ void wordTranslated(const QString &word); private slots: void on_translationView_sourceChanged(const QUrl &name); void saveToFile(); void speak(); void print(); private: DictBrowser *m_translationView; QToolBar *m_toolBar; }; } #endif // DICTWIDGET_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-0.12.9.orig/qstardict/application.h0000644000175000017500000000736411023552142017663 0ustar alexalex/***************************************************************************** * application.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef APPLICATION_H #define APPLICATION_H #include #ifdef QSTARDICT_WITH_TRANSLATIONS class QTranslator; #endif // QSTARDICT_WITH_TRANSLATIONS namespace QStarDict { class DictCore; class MainWindow; class PopupWindow; class Speaker; class TrayIcon; #ifdef QSTARDICT_WITH_DBUS class DBusAdaptor; #endif // QSTARDICT_WITH_DBUS /** * Main application class. */ class Application: public QApplication { Q_OBJECT public: /** * Construct new QStarDict application. */ Application(int &argc, char **argv); /** * Destructor. */ ~Application(); /** * Enter the main event loop and wait until exit(). */ int exec(); /** * Returns a pointer to the application's QStarDict::Application instance. */ static Application *instance() { return qobject_cast(QCoreApplication::instance()); } /** * Returns a pointer to the DictCore instance. */ DictCore *dictCore() { return m_dictCore; } /** * Returns a pointer to the application's main window. */ MainWindow *mainWindow() { return m_mainWindow; } /** * Returns a pointer to the application's popup window. */ PopupWindow *popupWindow() { return m_popupWindow; } /** * Returns a pointer to the application's speacker. */ Speaker *speaker() { return m_speaker; } /** * Returns a pointer to the tray icon. */ TrayIcon *trayIcon() { return m_trayIcon; } #ifdef QSTARDICT_WITH_DBUS /** * Returns a pointer to the DBusAdaptor instance. */ DBusAdaptor *dbusAdaptor() { return m_dbusAdaptor; } #endif // QSTARDICT_WITH_DBUS private: #ifdef QSTARDICT_WITH_TRANSLATIONS QTranslator *m_translator; QTranslator *m_qtTranslator; #endif // QSTARDICT_WITH_TRANSLATIONS DictCore *m_dictCore; MainWindow *m_mainWindow; PopupWindow *m_popupWindow; Speaker *m_speaker; TrayIcon *m_trayIcon; #ifdef QSTARDICT_WITH_DBUS DBusAdaptor *m_dbusAdaptor; #endif // QSTARDICT_WITH_DBUS }; } #endif // APPLICATION_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent qstardict-0.12.9.orig/qstardict/speaker.cpp0000644000175000017500000000455211023552142017341 0ustar alexalex/***************************************************************************** * speaker.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "speaker.h" #include #include namespace QStarDict { Speaker::Speaker() { m_speechProcess = new QProcess; QSettings settings; m_speechCmd = settings.value("Speaker/speechCmd", "festival --tts").toString(); } Speaker::~Speaker() { QSettings settings; settings.setValue("Speaker/speechCmd", m_speechCmd); delete m_speechProcess; } void Speaker::speak(const QString &word) { if (m_speechCmd.isEmpty()) return; if (m_speechProcess->state() != QProcess::NotRunning) m_speechProcess->kill(); QString s = m_speechCmd; s.replace("%s", word); m_speechProcess->start(s, QIODevice::WriteOnly); if (! m_speechProcess->waitForStarted()) return; if (! m_speechCmd.contains("%s")) { m_speechProcess->write(word.toUtf8()); m_speechProcess->closeWriteChannel(); } } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-0.12.9.orig/qstardict/speaker.h0000644000175000017500000000364711023552142017012 0ustar alexalex/***************************************************************************** * speaker.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef SPEAKER_H #define SPEAKER_H #include class QProcess; namespace QStarDict { class Speaker { public: Speaker(); virtual ~Speaker(); void speak(const QString &word); void setSpeechCmd(const QString &cmd) { m_speechCmd = cmd; } const QString &speechCmd() const { return m_speechCmd; } private: QString m_speechCmd; QProcess *m_speechProcess; }; } #endif // SPEAKER_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent qstardict-0.12.9.orig/qstardict/dictwidget.cpp0000644000175000017500000001377411023552142020044 0ustar alexalex/***************************************************************************** * dictwidget.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "dictwidget.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "application.h" #include "dictbrowser.h" #include "speaker.h" namespace { class DictWidgetToolbar: public QToolBar { public: DictWidgetToolbar(QWidget *parent = 0) : QToolBar(parent) { } protected: virtual void mouseDoubleClickEvent(QMouseEvent *event) { if (! actionAt(event->pos())) QToolBar::mouseDoubleClickEvent(event); } }; } namespace QStarDict { DictWidget::DictWidget(QWidget *parent, Qt::WindowFlags f) : QFrame(parent, f) { m_translationView = new DictBrowser(this); setFrameStyle(m_translationView->frameStyle()); m_translationView->setFrameStyle(QFrame::NoFrame); m_translationView->verticalScrollBar()->setCursor(Qt::ArrowCursor); m_translationView->horizontalScrollBar()->setCursor(Qt::ArrowCursor); m_translationView->setOpenExternalLinks(true); connect(m_translationView, SIGNAL(sourceChanged(const QUrl&)), SLOT(on_translationView_sourceChanged(const QUrl&))); m_toolBar = new DictWidgetToolbar(this); m_toolBar->setMouseTracking(true); QAction *actionBackward = m_toolBar->addAction(QIcon(":/icons/go-previous.png"), tr("Go to &previous translation"), m_translationView, SLOT(backward())); actionBackward->setDisabled(true); connect(m_translationView, SIGNAL(backwardAvailable(bool)), actionBackward, SLOT(setEnabled(bool))); QAction *actionForward = m_toolBar->addAction(QIcon(":/icons/go-next.png"), tr("Go to &next translation"), m_translationView, SLOT(forward())); actionForward->setDisabled(true); connect(m_translationView, SIGNAL(forwardAvailable(bool)), actionForward, SLOT(setEnabled(bool))); m_toolBar->addAction(QIcon(":/icons/document-save-as.png"), tr("&Save to file"), this, SLOT(saveToFile())); m_toolBar->addAction(QIcon(":/icons/document-print.png"), tr("Prin&t translation"), this, SLOT(print())); m_toolBar->addAction(QIcon(":/icons/speaker.png"), tr("Speak &word"), this, SLOT(speak())); QVBoxLayout *layout = new QVBoxLayout(this); layout->setMargin(0); layout->setSpacing(0); layout->addWidget(m_toolBar); layout->addWidget(m_translationView); setLayout(layout); } void DictWidget::translate(const QString &str) { m_translationView->setSource(QUrl("qstardict:" + str)); } void DictWidget::on_translationView_sourceChanged(const QUrl &name) { emit wordTranslated(name.toString(QUrl::RemoveScheme)); } void DictWidget::saveToFile() { QFileDialog dialog(this, tr("Save translation"), QDir::homePath() + "/" + translatedWord()); dialog.setFilters(QStringList() << tr("HTML files (*.html, *.htm)") << tr("Text files (*.txt)")); if (dialog.exec() && dialog.selectedFiles().size()) { QString fileName = dialog.selectedFiles().first(); QString filter = dialog.selectedFilter(); if (filter == tr("HTML files (*.html, *.htm)") && ! (fileName.endsWith(".html", Qt::CaseInsensitive) || fileName.endsWith(".htm", Qt::CaseInsensitive))) fileName += ".html"; else if (filter == tr("Text files (*.txt)") && ! fileName.endsWith(".txt", Qt::CaseInsensitive)) fileName += ".txt"; QFile outputFile(fileName); if (! outputFile.open(QIODevice::WriteOnly | QIODevice::Text)) { QMessageBox::warning(this, tr("Error"), tr("Cannot save translation as %1").arg(fileName)); return; } QTextStream outputStream(&outputFile); if (filter == tr("HTML files (*.html, *.htm)")) outputStream << m_translationView->document()->toHtml("UTF-8"); else outputStream << m_translationView->toPlainText(); } } void DictWidget::speak() { Application::instance()->speaker()->speak(translatedWord()); } void DictWidget::print() { QPrinter printer(QPrinter::HighResolution); QPrintDialog dialog(&printer, this); if (dialog.exec() == QDialog::Accepted) m_translationView->print(&printer); } void DictWidget::setDefaultStyleSheet(const QString &css) { m_translationView->document()->setDefaultStyleSheet(css); m_translationView->reload(); } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-0.12.9.orig/qstardict/qstardict.desktop0000644000175000017500000000027711023552142020574 0ustar alexalex[Desktop Entry] Version=1.0 Comment=QStarDict is Qt version of StarDict Exec=qstardict GenericName=Dictionary Icon=qstardict Name=QStarDict Type=Application Categories=Qt;Dictionary;Utility qstardict-0.12.9.orig/qstardict/trayicon.cpp0000644000175000017500000000765011023552142017541 0ustar alexalex/***************************************************************************** * trayicon.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "trayicon.h" #include #include #include "application.h" #include "mainwindow.h" #include "popupwindow.h" #include "settingsdialog.h" namespace QStarDict { TrayIcon::TrayIcon(QObject *parent) : QSystemTrayIcon(parent) { QMenu *trayMenu = new QMenu(tr("QStarDict")); QAction *actionScan = new QAction(tr("&Scan"), this); actionScan->setCheckable(true); actionScan->setChecked(Application::instance()->popupWindow()->isScan()); setScanEnabled(Application::instance()->popupWindow()->isScan()); connect(actionScan, SIGNAL(toggled(bool)), Application::instance()->popupWindow(), SLOT(setScan(bool))); connect(Application::instance()->popupWindow(), SIGNAL(scanChanged(bool)), actionScan, SLOT(setChecked(bool))); connect(Application::instance()->popupWindow(), SIGNAL(scanChanged(bool)), SLOT(setScanEnabled(bool))); trayMenu->addAction(actionScan); QAction *actionSettings = new QAction(QIcon(":/icons/configure.png"), tr("&Configure QStarDict"), this); connect(actionSettings, SIGNAL(triggered()), SLOT(on_actionSettings_triggered())); trayMenu->addAction(actionSettings); QAction *actionQuit = new QAction(QIcon(":/icons/application-exit.png"), tr("&Quit"), this); connect(actionQuit, SIGNAL(triggered()), Application::instance(), SLOT(quit())); trayMenu->addAction(actionQuit); setContextMenu(trayMenu); connect(this, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), SLOT(on_activated(QSystemTrayIcon::ActivationReason))); } void TrayIcon::on_activated(QSystemTrayIcon::ActivationReason reason) { switch (reason) { case QSystemTrayIcon::Trigger: Application::instance()->mainWindow()->setVisible(! Application::instance()->mainWindow()->isVisible()); break; case QSystemTrayIcon::MiddleClick: Application::instance()->popupWindow()->showTranslation(Application::clipboard()->text(QClipboard::Selection)); break; default: ; // nothing } } void TrayIcon::on_actionSettings_triggered() { SettingsDialog dialog(Application::instance()->mainWindow()); dialog.exec(); } void TrayIcon::setScanEnabled(bool enabled) { QIcon icon(enabled ? ":/icons/qstardict.png" : ":/icons/qstardict-disabled.png"); setIcon(icon); setToolTip(tr("QStarDict: scanning is %1").arg(enabled ? tr("enabled") : tr("disabled"))); } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-0.12.9.orig/qstardict/selection.cpp0000644000175000017500000000535311023552142017674 0ustar alexalex/***************************************************************************** * selection.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "selection.h" #ifdef Q_WS_WIN #include namespace { QString currentSelection() { POINT Point; HWND hWindow; DWORD dwStart, dwEnd; char szWindowText[256]; if (! GetCursorPos(&Point)) return QString(); if( ! (hWindow = WindowFromPoint(Point))) return QString(); SendMessage(hWindow, WM_GETTEXT, 256, (LPARAM)szWindowText); SendMessage(hWindow, EM_GETSEL, (WPARAM)&dwStart, (LPARAM)&dwEnd); return QString::fromLocal8Bit(szWindowText); } } #else // Q_WS_WIN #include #include namespace { inline QString currentSelection() { return QApplication::clipboard()->text(QClipboard::Selection); } } #endif // Q_WS_WIN namespace QStarDict { Selection::Selection(QObject *parent) : QObject(parent) { m_scan = false; m_timerId = 0; } void Selection::setScan(bool scan) { if (m_scan == scan) return; m_scan = scan; if (m_scan) { m_lastState = currentSelection(); m_timerId = startTimer(300); } else killTimer(m_timerId); } void Selection::timerEvent(QTimerEvent*) { if (m_lastState != currentSelection()) { m_lastState = currentSelection(); emit changed(m_lastState); } } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-0.12.9.orig/qstardict/application.cpp0000644000175000017500000000637611023552142020220 0ustar alexalex/***************************************************************************** * application.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "application.h" #ifdef QSTARDICT_WITH_TRANSLATIONS #include #include #include #endif // QSTARDICT_WITH_TRANSLATIONS #include "dictcore.h" #include "mainwindow.h" #include "popupwindow.h" #include "speaker.h" #include "trayicon.h" #ifdef QSTARDICT_WITH_DBUS #include "dbusadaptor.h" #endif // QSTARDICT_WITH_DBUS namespace QStarDict { Application::Application(int &argc, char **argv) : QApplication(argc, argv) { setOrganizationName("qstardict"); setApplicationName("qstardict"); setQuitOnLastWindowClosed(false); #ifdef QSTARDICT_WITH_TRANSLATIONS m_translator = new QTranslator; m_translator->load("qstardict-" + QLocale::system().name(), QSTARDICT_TRANSLATIONS_DIR); installTranslator(m_translator); m_qtTranslator = new QTranslator; m_qtTranslator->load("qt_" + QLocale::system().name(), QLibraryInfo::location(QLibraryInfo::TranslationsPath)); installTranslator(m_qtTranslator); #endif // QSTARDICT_WITH_TRANSLATIONS m_dictCore = new DictCore; m_popupWindow = new PopupWindow; m_popupWindow->setDict(m_dictCore); m_speaker = new Speaker; m_mainWindow = new MainWindow; m_mainWindow->setDict(m_dictCore); m_trayIcon = new TrayIcon; #ifdef QSTARDICT_WITH_DBUS m_dbusAdaptor = new DBusAdaptor(m_mainWindow); #endif // QSTARDICT_WITH_DBUS } Application::~Application() { delete m_trayIcon; delete m_mainWindow; delete m_popupWindow; delete m_speaker; delete m_dictCore; #ifdef QSTARDICT_WITH_TRANSLATIONS removeTranslator(m_translator); delete m_translator; removeTranslator(m_qtTranslator); delete m_qtTranslator; #endif // QSTARDICT_WITH_TRANSLATIONS } int Application::exec() { m_trayIcon->show(); return QApplication::exec(); } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-0.12.9.orig/qstardict/settingsdialog.cpp0000644000175000017500000003066311023552142020731 0ustar alexalex/***************************************************************************** * settingsdialog.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "settingsdialog.h" #include #include #include #include #include #include #include #include "dictcore.h" #include "mainwindow.h" #include "popupwindow.h" #include "application.h" #include "speaker.h" namespace { int toPercents(double value) { int integralValue = static_cast(value * 100.0); if (value * 100.0 - 0.5 > integralValue) ++integralValue; return integralValue; } } namespace QStarDict { SettingsDialog::SettingsDialog(QWidget *parent) : QDialog(parent) { setupUi(this); DictCore *dict = Application::instance()->dictCore(); m_oldPlugins = dict->loadedPlugins(); m_oldDicts = dict->loadedDicts(); m_pluginsModel = new QStandardItemModel(this); m_pluginsModel->setHorizontalHeaderLabels( QStringList() << tr("Enabled") << tr("Name")); loadPluginsList(); pluginsTableView->setModel(m_pluginsModel); pluginsTableView->verticalHeader()->hide(); pluginsTableView->setColumnWidth(0, 60); pluginsTableView->setColumnWidth(1, 320); m_dictsModel = new QStandardItemModel(this); m_dictsModel->setHorizontalHeaderLabels(QStringList() << tr("Enabled") << tr("Name") << tr("Plugin")); loadDictsList(); dictsTableView->setModel(m_dictsModel); dictsTableView->verticalHeader()->hide(); dictsTableView->setColumnWidth(0, 60); dictsTableView->setColumnWidth(1, 200); dictsTableView->setColumnWidth(2, 120); // Load global settings instantSearchBox->setChecked(Application::instance()->mainWindow()->isInstantSearch()); speechCmdEdit->setText(Application::instance()->speaker()->speechCmd()); // Load popup window settings PopupWindow *popup = Application::instance()->popupWindow(); useScanBox->setChecked(popup->isScan()); if (popup->modifierKey()) { useScanModifierBox->setChecked(true); QString modifierName; switch (popup->modifierKey()) { case Qt::ShiftModifier: modifierName = "Shift"; break; case Qt::ControlModifier: modifierName = "Control"; break; case Qt::AltModifier: modifierName = "Alt"; break; case Qt::MetaModifier: modifierName = "Win"; break; } modifierKeyBox->setCurrentIndex(modifierKeyBox->findText(modifierName)); } showIfNotFoundBox->setChecked(popup->showIfNotFound()); popupOpacitySpin->setValue(toPercents(popup->windowOpacity())); timeoutBeforeHideSpin->setValue(popup->timeoutBeforeHide() / 1000.0); popupDefaultWidthSpin->setValue(popup->defaultSize().width()); popupDefaultHeightSpin->setValue(popup->defaultSize().height()); pronounceWordBox->setChecked(popup->pronounceWord()); // Load translations CSS QHash cssAliases; cssAliases["body"] = tr("All translation"); cssAliases["font.dict_name"] = tr("Dictionary name"); cssAliases["font.title"] = tr("Title"); cssAliases["font.explanation"] = tr("Explanation"); cssAliases["font.abbreviature"] = tr("Abbreviation"); cssAliases["font.example"] = tr("Example"); cssAliases["font.transcription"] = tr("Transcription"); apperanceCSSEdit->setElementsAliases(cssAliases); apperanceCSSEdit->setCSS(Application::instance()->mainWindow()->defaultStyleSheet()); connect(m_pluginsModel, SIGNAL(itemChanged(QStandardItem*)), SLOT(pluginsItemChanged(QStandardItem*))); } void SettingsDialog::accept() { // Save dicts and plugins settings DictCore *dict = Application::instance()->dictCore(); QStringList loadedPlugins; int rowCount = m_pluginsModel->rowCount(); for (int i = 0; i < rowCount; ++i) if (m_pluginsModel->item(i, 0)->checkState() == Qt::Checked) loadedPlugins << m_pluginsModel->item(i, 1)->text(); dict->setLoadedPlugins(loadedPlugins); QList loadedDicts; rowCount = m_dictsModel->rowCount(); for (int i = 0; i < rowCount; ++i) if (m_dictsModel->item(i, 0)->checkState() == Qt::Checked) loadedDicts << DictCore::Dictionary(m_dictsModel->item(i, 2)->text(), m_dictsModel->item(i, 1)->text()); dict->setLoadedDicts(loadedDicts); // Save global settings Application::instance()->mainWindow()->setInstantSearch(instantSearchBox->isChecked()); Application::instance()->speaker()->setSpeechCmd(speechCmdEdit->text()); // Save popup window settings PopupWindow *popup = Application::instance()->popupWindow(); popup->setScan(useScanBox->isChecked()); int modifierKey = 0; if (useScanModifierBox->isChecked()) if (modifierKeyBox->currentText() == "Shift") modifierKey = Qt::ShiftModifier; else if (modifierKeyBox->currentText() == "Control") modifierKey = Qt::ControlModifier; else if (modifierKeyBox->currentText() == "Alt") modifierKey = Qt::AltModifier; else if (modifierKeyBox->currentText() == "Win") modifierKey = Qt::MetaModifier; popup->setShowIfNotFound(showIfNotFoundBox->isChecked()); popup->setModifierKey(modifierKey); popup->setWindowOpacity(popupOpacitySpin->value() / 100.0); popup->setTimeoutBeforeHide(static_cast(timeoutBeforeHideSpin->value() * 1000.0)); popup->setDefaultSize(QSize(popupDefaultWidthSpin->value(), popupDefaultHeightSpin->value())); popup->setPronounceWord(pronounceWordBox->isChecked()); // Save translations CSS Application::instance()->mainWindow()->setDefaultStyleSheet(apperanceCSSEdit->css()); Application::instance()->popupWindow()->setDefaultStyleSheet(apperanceCSSEdit->css()); Application::instance()->mainWindow()->reload(); QDialog::accept(); } void SettingsDialog::reject() { DictCore *dict = Application::instance()->dictCore(); dict->setLoadedPlugins(m_oldPlugins); dict->setLoadedDicts(m_oldDicts); QDialog::reject(); } void SettingsDialog::loadDictsList() { int i; QList loadedDicts = Application::instance()->dictCore()->loadedDicts(); m_dictsModel->setRowCount(0); for (i = 0; i < loadedDicts.size(); ++i) { QStandardItem *item = new QStandardItem(); item->setCheckable(true); item->setCheckState(Qt::Checked); m_dictsModel->setItem(i, 0, item); m_dictsModel->setItem(i, 1, new QStandardItem(loadedDicts[i].name())); m_dictsModel->setItem(i, 2, new QStandardItem(loadedDicts[i].plugin())); } QList dicts = Application::instance()->dictCore()->availableDicts(); for (QList::const_iterator iter = dicts.begin(); iter != dicts.end(); ++iter) { if (! loadedDicts.contains(*iter)) { QStandardItem *item = new QStandardItem(); item->setCheckable(true); item->setCheckState(Qt::Unchecked); m_dictsModel->setItem(i, 0, item); m_dictsModel->setItem(i, 1, new QStandardItem(iter->name())); m_dictsModel->setItem(i, 2, new QStandardItem(iter->plugin())); ++i; } } } void SettingsDialog::loadPluginsList() { m_pluginsModel->setRowCount(0); DictCore *dict = Application::instance()->dictCore(); QStringList plugins = dict->availablePlugins(); QStringList loaded = dict->loadedPlugins(); for (int i = 0; i < plugins.size(); ++i) { QStandardItem *item = new QStandardItem(); item->setCheckable(true); item->setCheckState(loaded.contains(plugins[i]) ? Qt::Checked : Qt::Unchecked); m_pluginsModel->setItem(i, 0, item); m_pluginsModel->setItem(i, 1, new QStandardItem(plugins[i])); } } void SettingsDialog::on_dictsMoveUpButton_clicked() { int currentRow = dictsTableView->currentIndex().row(); if (currentRow > 0) { m_dictsModel->insertRow(currentRow - 1, m_dictsModel->takeRow(currentRow)); dictsTableView->selectRow(currentRow - 1); } } void SettingsDialog::on_dictsMoveDownButton_clicked() { int currentRow = dictsTableView->currentIndex().row(); if (currentRow < m_dictsModel->rowCount() - 1) { m_dictsModel->insertRow(currentRow + 1, m_dictsModel->takeRow(currentRow)); dictsTableView->selectRow(currentRow + 1); } } void SettingsDialog::on_dictsShowInfoButton_clicked() { int currentRow = dictsTableView->currentIndex().row(); if (currentRow == -1) return; QString dict = m_dictsModel->item(currentRow, 1)->text(); QString plugin = m_dictsModel->item(currentRow, 2)->text(); DictPlugin::DictInfo info = Application::instance()->dictCore()->plugin(plugin)->dictInfo(dict); QMessageBox::information(this, tr("Information about dictionary \"%1\"").arg(dict), tr("Name: %1
    ").arg(dict) + tr("Plugin: %1
    ").arg(plugin) + tr("Author: %1
    ").arg(info.author()) + tr("Words count: %1
    ").arg((info.wordsCount() == -1) ? tr("unknown") : QString::number(info.wordsCount())) + tr("Description: %1").arg(info.description())); } void SettingsDialog::on_pluginsShowInfoButton_clicked() { int currentRow = pluginsTableView->currentIndex().row(); if (currentRow == -1) return; DictPlugin *plugin = Application::instance()->dictCore()->plugin(m_pluginsModel->item(currentRow, 1)->text()); if (! plugin) return; QMessageBox::information(this, tr("Information about %1 plugin").arg(plugin->name()), tr("Name: %1
    ").arg(plugin->name()) + tr("Version: %1
    ").arg(plugin->version()) + tr("Authors: %1
    ").arg(plugin->authors().replaceInStrings("<", "<").replaceInStrings(">", ">").join(tr("
    "))) + tr("Can search similar words: %1
    ").arg(plugin->features().testFlag(DictPlugin::SearchSimilar) ? tr("yes") : tr("no")) + tr("Description: %1").arg(plugin->description())); } void SettingsDialog::on_pluginsConfigureButton_clicked() { int currentRow = pluginsTableView->currentIndex().row(); if (currentRow == -1) return; DictCore *dict = Application::instance()->dictCore(); DictPlugin *plugin = dict->plugin(m_pluginsModel->item(currentRow, 1)->text()); if (plugin && plugin->execSettingsDialog(this) == QDialog::Accepted) { dict->reloadDicts(); loadDictsList(); } } void SettingsDialog::pluginsItemChanged(QStandardItem *item) { if (item->isCheckable()) { DictCore *dict = Application::instance()->dictCore(); QStringList loadedPlugins; int rowCount = m_pluginsModel->rowCount(); for (int i = 0; i < rowCount; ++i) if (m_pluginsModel->item(i, 0)->checkState() == Qt::Checked) loadedPlugins << m_pluginsModel->item(i, 1)->text(); dict->setLoadedPlugins(loadedPlugins); dict->reloadDicts(); loadDictsList(); } } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-0.12.9.orig/ChangeLog0000644000175000017500000000661411023552142014760 0ustar alexalex* Version 0.01 - initial release * Version 0.02: - add dictionary directories selection in settings dialog - redesign menus - add Oxygen icons - add "Save translation" action - add pop up window opacity item to settings dialog - rename actions - add .desktop file * Version 0.03: - fix bug when build fails on x86_64 - fix categories in .desktop file - add option "Show pop up only if modifier pressed" in settings dialog - improve selection scanning - fix bug with closing window when it must hide - setting Qt 4.2 compitibility - add russian translation - add traditional chinese translation * Version 0.04 - add ukrainian translation - fix bug when popup window violates from desktop - add translations reformater - add popup window timeout before hide after mouse over to settings dialog - fix bug with "Up" buttons in settings dialog - add popup window default width and height items to settings dialog - change PopupWindow base class from QWidget to QFrame - add D-Bus support - make popup window resizable - add current translation title to main window header * Version 0.05 - fix bug with hard font-family in translation CSS - make popup window border more useful - fix bug with words list - add simplified chinese translation - fix bug with uncorrect displayed hierarchical lists - set to run only one instance of application - set to search for dictionaries recursively * Version 0.06 - add bulgarian translation - add speech support - fix bug with broken main window title when search is empty * Version 0.07 - add "translate" and "translateHtml" methods to D-Bus interface - change license from GPLv3 to GPLv2 * Version 0.08 - add czech translation - fix bug with multiple running from different users - add brazilian portuguese translation - update the traditional chinese translation - add support for configurable instant search - add support for separate translations * Version 0.09 - add polish translation - fix bug with instant search - add italian translation - fix bug with simlinks to dictionaries - add german translation - improve popup window - update the german translation - reorganize project - add basic Windows support - add plugins support - add toolbar to dictionary widget - add for links in translations (by pressing Ctrl and clicking on the word) - improve instant search - improve popup window - add support for closing popup by double click on toolbar * Version 0.10 - change tray icon if scanning disabled - add font editor - some improves and bugfixes * Version 0.11 - fix bug with bad source word - fix bug with removed last letter in translation * Version 0.12 - update italian translation - add support for popup window moving * Version 0.12.1 - fix critical bug with popup window * Version 0.12.2 - fix bug with building on Ubuntu Hardy * Version 0.12.3 - update simplified chinese translation * Version 0.12.4 - update polish translation * Version 0.12.5 - fix bug with main window title * Version 0.12.6 - update german translation * Version 0.12.7 - fix bug with empty speech cmd * Version 0.12.8 - add localization for standard Qt dialogs - add support for Escape key in main window - update ukrainian translation - update chinese translation - fix bug with speaker - remove alphabetical sorting of results - improve saving - add a tooltip for the tray icon * Version 0.12.9 - update german translation - fix typo in the COPYING filename qstardict-0.12.9.orig/THANKS0000644000175000017500000000207111023552142014112 0ustar alexalexThanks to: Petr Vanek whoes offer some improves and add the Windows support Andrew Gaydenko whoes help to fix a bug with building in x86_64 Vadim Kalinnikov whoes give a hosting Hoopoe whoes add a traditional chinese translation Yurij Goncharuck whoes fix bug when popup window violates from desktop and add ukrainian translation Truth whoes add a simplified chinese translation Nikola Valentinov Petrov whoes add a bulgarian translation Jiri Hlinka whoes add a czech translation Klaos Lacerda and Bruno Gonçalves whoes add a brazilian portuguese translation Zhengpeng Hou whoes update the traditional chinese translation Grzegorz Gibas whoes add the polosh translation Simone Solinas whoes add the italian translation Stefan Kombrink whoes improve the popup window and update german translation Matthias Fehring whoes update german translations Albert Tugushev whoes help to fix bug with empty speech cmd Ilya Kotov whoes help to improve localization Alex Koudr whoes help with with mouse scanning on Windows qstardict-0.12.9.orig/AUTHORS0000644000175000017500000000037311023552142014252 0ustar alexalexAlexander Rodin The authors of the StarDict plugin: Hu Zheng Opera Wang Rickard E. Faith QStarDict uses the Oxygen icons (http://oxygen-icons.org) qstardict-0.12.9.orig/COPYING0000644000175000017500000004310311023552142014233 0ustar alexalex GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. qstardict-0.12.9.orig/qstardict.pri0000644000175000017500000000714111023552142015714 0ustar alexalex############################################################################# # qstardict.pri - QStarDict, a StarDict clone written with using Qt # # Copyright (C) 2008 Alexander Rodin # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License along # # with this program; if not, write to the Free Software Foundation, Inc., # # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # ############################################################################# VERSION = 0.12.9 QT = \ core \ gui \ network \ xml CONFIG += \ qt \ warn_on \ release CONFIG += \ link_pkgconfig PKGCONFIG += \ glib-2.0 unix:LIBS += -lz windows:LIBS += -lzdll unix:DEFINES += HAVE_MMAP unix:isEmpty(NO_DBUS):!contains(QT_CONFIG, qdbus): NO_DBUS = 1 unix:isEmpty(NO_DBUS):CONFIG += qdbus unix:isEmpty(NO_DBUS):DEFINES += QSTARDICT_WITH_DBUS isEmpty(NO_TRANSLATIONS):DEFINES += QSTARDICT_WITH_TRANSLATIONS unix { isEmpty(INSTALL_PREFIX):INSTALL_PREFIX=/usr isEmpty(BIN_DIR):BIN_DIR=$$INSTALL_PREFIX/bin isEmpty(DATA_DIR):DATA_DIR=$$INSTALL_PREFIX/share/qstardict isEmpty(NO_TRANSLATIONS):isEmpty(TRANSLATIONS_DIR):TRANSLATIONS_DIR=$$DATA_DIR/translations isEmpty(PLUGINS_DIR):PLUGINS_DIR=$$INSTALL_PREFIX/lib/qstardict/plugins isEmpty(DOCS_DIR):DOCS_DIR=$$INSTALL_PREFIX/share/doc/qstardict DEFINES += QSTARDICT_VERSION=\\\"$$VERSION\\\" DEFINES += QSTARDICT_INSTALL_PREFIX=\\\"$$INSTALL_PREFIX\\\" DEFINES += QSTARDICT_BIN_DIR=\\\"$$BIN_DIR\\\" DEFINES += QSTARDICT_DATA_DIR=\\\"$$DATA_DIR\\\" isEmpty(NO_TRANSLATIONS):DEFINES += QSTARDICT_TRANSLATIONS_DIR=\\\"$$TRANSLATIONS_DIR\\\" DEFINES += QSTARDICT_PLUGINS_DIR=\\\"$$PLUGINS_DIR\\\" } else:win32 { isEmpty(INSTALL_PREFIX):INSTALL_PREFIX= isEmpty(BIN_DIR):BIN_DIR=$$INSTALL_PREFIX/ isEmpty(DATA_DIR):DATA_DIR=$$INSTALL_PREFIX/data isEmpty(NO_TRANSLATIONS):isEmpty(TRANSLATIONS_DIR):TRANSLATIONS_DIR=$$INSTALL_PREFIX/translations isEmpty(PLUGINS_DIR):PLUGINS_DIR=$$INSTALL_PREFIX/plugins isEmpty(DOCS_DIR):DOCS_DIR=$$INSTALL_PREFIX/docs DEFINES += QSTARDICT_VERSION=\\\"$$VERSION\\\" DEFINES += QSTARDICT_INSTALL_PREFIX=\(QApplication::applicationDirPath\(\)+\\\"$$INSTALL_PREFIX\\\"\) DEFINES += QSTARDICT_BIN_DIR=\(QApplication::applicationDirPath\(\)+\\\"$$BIN_DIR\\\"\) DEFINES += QSTARDICT_DATA_DIR=\(QApplication::applicationDirPath\(\)+\\\"$$DATA_DIR\\\"\) isEmpty(NO_TRANSLATIONS):DEFINES += QSTARDICT_TRANSLATIONS_DIR=\(QApplication::applicationDirPath\(\)+\\\"$$TRANSLATIONS_DIR\\\"\) DEFINES += QSTARDICT_PLUGINS_DIR=\(QApplication::applicationDirPath\(\)+\\\"$$PLUGINS_DIR\\\"\) }