translatoid

Plasma 4 Extensions

Source (link to git-repo or to original if based on someone elses unmodified work): Add the source-code for this project on opencode.net

31
6 .8
Description:

translator using google translator!
And it's my first plasmoids!!

svn co svn://anonsvn.kde.org/home/kde/trunk/playground/base/plasma/applets/translatoid
Last changelog:

9 years ago

-clear code
-add Catalan flag
-Add language title
- use Frame for the maintitle.
- Correct some encodage bug
- and more....

===0.4
- use kde svn :
http://websvn.kde.org/trunk/playground/base/plasma/applets/translatoid
- use PopupApplet! Now, Translatoid can be dock inside the main bar!
- Change language selection method! Now, You have to click and a KlistWidget appear !
- Add Copy and Past button
- Add AutoDetection language in languageList
- Add TooTip Message

Now, I need translator for translate, this translator... :)

===0.4.1
add Licence
add GPL2 header
replace setIcon() by nativeWidget()->seticon()

=====0.5
Add ListWidgetFlag inside the plasma and it appear with a Plasma::Animation!
Add Voice TTS support.

TODO : auto select - enter key - flag disabled for fedora!

======0.6
-AutoPaste the copy selection and autotranslate when you active Popup.
-GrabKeyboard when you active Popup
-Add "Clear Button"
-remove Cancel Button from DialogBox
-Add Po language file.
- Change inverse language icon
- Add Fedora Package without flags

====0.6.1
- Add new Icon
- change name : translatoid to plasma-applet-translatoid

======0.7
add New popup icon which can change his flags
use KConfigGroup for save favorite language
add FavoriteLanguage config dialog
some update of the code

=======0.8
IMPORTANT RELEASE :
change the algorithm of source translation. Now it use Post Method. It means that you can translate big text. And if you type 1 word, it get you the dictionnary result ! :) Thanks lexnewton.
=======0.9
-add new flags list ! Use a plasma::treeview with a QAbstractModel
-copy from the clipboard! Now, you just have to select a source text from anywhere, and active the popup, by cliking on the popup, or by a plasma shortcut.
-Change QTextEdit source event. Now, press Enter to translate, and press Shift+Enter to add a new line.

=======1.0
Change icon
Change a lot by aseigo , use KJob, nice animation during translate.
change the structure of translatoid
Will remove voice button, because KTTSD do the same job.
add estonishlanguage
===RC
After some error of myself! This is the good one :
- Set text color with theme color
- save your automaticaly last languages in use.

==1.1beta==== MAJOR CORRECTION
Now Translatoid use extender
Add Reminder extender to remind you some word after clicking on the star
Replace parsing by Json parsing. YOU NEED TO INSTALL libqjson
Clear some code and probably add some new bug.. :)
If you have some probs, contact me!

---1.1
Add new language :
"Afrikaans"
"Albanais"
"Albanais"
"Belarusian"
"Irish""Icelandic"
"Macedonian"
"Malaysia"
"Maltese"
"Persan"
"Swahili"
"Turkish"
"Yiddish"

1.12 ( Minor fix)
Just fix Icon installation...Sorry)
A new release will come out quickly

1.2 ( Minor fix)
Correct Html rending

1.21
Correct text color in "remind" area

1.30
Correct Json parser with new Google Api. Thanks alex789

1.30 bis
dominique fix

3

chepioq

10 years ago

Hi
I apply your patch to the 1.21 version and now when I do a translation (french to english..).
I have:


french
Red Bull, en plaçant ses deux pilotes, Sebastian Vettel, l'auteur de la pole position


english:
[[["Red Bull, by placing its two drivers, Sebastian Vettel, the author of the pole","Red Bull, en plaçant ses deux pilotes, Sebastian Vettel, l'auteur de la pole position",""]],,"fr"]

As you see it's not perfect, but the translation is here...

Report

alex789

10 years ago

i know it, now test final patch:

https://build.opensuse.org/package/view_file?file=json-parser.patch&package=share_for_patchs&project=home%3Aalexqwesa

or

-- plasmoid-translatoid/package/ktranslatoid.cpp 2009-11-19 22:59:15.000000000 +0300
+++ ktranslatoid.cpp 2010-06-27 05:23:31.000000000 +0400
@@ -302,57 +302,59 @@
m_job = 0;
//kDebug() << "HTTP Request done." << m_data;

+ if (m_data.at(m_data.size()-6) == ',' &&
+ m_data.at(m_data.size()-7) == ','){
+ m_data.insert((m_data.size()-6), '"');
+ m_data.insert((m_data.size()-6), '"');
+ }
QString text;
+ QString dictionnary;
+ QString textToReturn = QString();
text = text.fromUtf8(m_data);
+ kDebug() << text;
/* m_data.clear();
kDebug() << "All data is read.";*/

- QVariantMap sentences;
- QVariantList dict;
- QString textToReturn = QString();
QJson::Parser parser;
bool ok;
- QVariantMap result = parser.parse(m_data,&ok).toMap();
+ QVariantList result = parser.parse(m_data,&ok).toList();

if (!ok) {
kDebug()<<"An error occured during parsing";
+ m_destText->setText(text);
return;
}

- if (result.contains("sentences"))
- sentences = result["sentences"].toList().at(0).toMap();
-
- if (result.contains("dict"))
- dict = result["dict"].toList();
-
- if ( sentences.contains("trans"))
- textToReturn += sentences["trans"].toString()+"<hr/>";
-
-
- QString dictionnary=QString();
- foreach ( QVariant var, dict)
+ foreach ( QVariant map, result)
{
-
- if ( var.type() == QVariant::Map)
+ if ( map.type() == QVariant::List)
{
- foreach ( QVariant map, var.toMap())
+ foreach ( QVariant map2, map.toList())
{
- if ( map.type() == QVariant::String)
- dictionnary+="<b>"+map.toString()+"</b><br/>";
-
- if ( map.type() == QVariant::List)
+ if ( map2.type() == QVariant::List)
{
- foreach ( QVariant word, map.toList())
- {
- dictionnary+=( word.toString() + " ");
+ bool ishow = true;
+ foreach ( QVariant var, map2.toList()){
+ if ( (var.type() == QVariant::String) && ishow){
+ ishow=false;
+ dictionnary+=("<b>" + var.toString() + "</b><br/>\n");
+ }
+ if ( var.type() == QVariant::List){
+ foreach ( QVariant var2, var.toList()){
+ if ( var2.type() == QVariant::String)
+ dictionnary+=(var2.toString()+"<br/>\n");
+ }
+ }
}
+ dictionnary+="<hr/>\n";
}
}
}
}
-
textToReturn += dictionnary;
- m_destText->setText(textToReturn);
+
+ m_destText->setText("<html><body>" + textToReturn + "</body></html>");
+ //m_destText->setHtml(textToReturn);
}

//===================================================================================

Report

alex789

10 years ago

now all should work good!

Report

3

chepioq

10 years ago

Thank for the patch, it's work fine on Fedora13 and Fedora14-rawhide

Report

3

chepioq

10 years ago

And now, do you think that dridk include this patch in the future release?

Report

3

chepioq

10 years ago

I use the svn version, and when I do /usr/bin/plasmoidviewer translatoid there is a crash with this log:
Quote:[dominique@localhost ~]$ /usr/bin/plasmoidviewer translatoid
plasmoidviewer(11450)/libplasma Plasma::AppletPrivate::mainConfigGroup: requesting config for "Translator" without a containment!
plasmoidviewer(11450)/libplasma Plasma::Applet::itemChange: Configuration object was requested prior to init(), which is too early. Please fix this item: QGraphicsItem(0) Plasma::Containment (this = 0x1cbf120 , parent = 0x0 , pos = QPointF(0, 0), z =0, flags = (ItemIsFocusable|ItemUsesExtendedStyleOption|ItemSendsGeometryChanges))"Translator"
Connecting to deprecated signal QDBusConnectionInterface::serviceOwnerChanged(QString,QString,QString)
QGraphicsLinearLayout::removeAt: invalid index 0
KCrash: Application 'plasmoidviewer' crashing...
sock_file=/home/dominique/.kde/socket-localhost.localdomain/kdeinit4__0

[1]+ Stopped /usr/bin/plasmoidviewer translatoid
[dominique@localhost ~]$

Report

alex789

10 years ago

No, I have no such problem

can you describe more detail?
is it really depend to my patch?
(i didn't touch translate() function...)

also what version you use?
(i use 1.1b)

for easy testing you can use
/usr/bin/plasmoidviewer translatoid

Report

3

chepioq

10 years ago

Hi...
There is problem with your patch..
The automatically translation work fine but when I write a sentence and try translate with translatoid, plasma crash:
here the output of crash:
Quote:Application: Espace de travail Plasma (plasma-desktop), signal: Segmentation fault
[Current thread is 1 (Thread 0x7f3ff7cc0820 (LWP 1710))]

Thread 3 (Thread 0x7f3fdb158710 (LWP 1711)):
#0 0x00000035cea0b729 in pthread_cond_timedwait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1 0x00000033476717f2 in QWaitCondition::wait(QMutex*, unsigned long) () from /usr/lib64/libQtCore.so.4
#2 0x0000003347667d01 in ?? () from /usr/lib64/libQtCore.so.4
#3 0x0000003347670995 in ?? () from /usr/lib64/libQtCore.so.4
#4 0x00000035cea07761 in start_thread () from /lib64/libpthread.so.0
#5 0x00000035ce2e14dd in clone () from /lib64/libc.so.6

Thread 2 (Thread 0x7f3fd177a710 (LWP 1742)):
#0 0x00000035cea0b729 in pthread_cond_timedwait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1 0x00000033476717f2 in QWaitCondition::wait(QMutex*, unsigned long) () from /usr/lib64/libQtCore.so.4
#2 0x0000003347667d01 in ?? () from /usr/lib64/libQtCore.so.4
#3 0x0000003347670995 in ?? () from /usr/lib64/libQtCore.so.4
#4 0x00000035cea07761 in start_thread () from /lib64/libpthread.so.0
#5 0x00000035ce2e14dd in clone () from /lib64/libc.so.6

Thread 1 (Thread 0x7f3ff7cc0820 (LWP 1710)):
[KCrash Handler]
#5 0x000000334776a16f in QObject::disconnect(QObject const*, char const*, QObject const*, char const*) () from /usr/lib64/libQtCore.so.4
#6 0x00007f3fddecf6ec in KTranslatoid::translate (this=0x224be60) at /home/dominique/translatoid/ktranslatoid.cpp:271
#7 0x00007f3fdded159c in KTranslatoid::qt_metacall (this=0x224be60, _c=QMetaObject::InvokeMetaMethod, _id=<value optimized out>, _a=0x7fff169f0e30)
at /home/dominique/translatoid/build/ktranslatoid.moc:97
#8 0x000000334776a81f in QMetaObject::activate(QObject*, QMetaObject const*, int, void**) () from /usr/lib64/libQtCore.so.4
#9 0x00007f3ff7ea8de8 in Plasma::PushButton::qt_metacall(QMetaObject::Call, int, void**) () from /usr/lib64/libplasma.so.3
#10 0x000000334776a81f in QMetaObject::activate(QObject*, QMetaObject const*, int, void**) () from /usr/lib64/libQtCore.so.4
#11 0x00000033495df8b2 in QAbstractButton::clicked(bool) () from /usr/lib64/libQtGui.so.4
#12 0x000000334932f06b in ?? () from /usr/lib64/libQtGui.so.4
#13 0x00000033493303eb in ?? () from /usr/lib64/libQtGui.so.4
#14 0x000000334933065c in QAbstractButton::mouseReleaseEvent(QMouseEvent*) () from /usr/lib64/libQtGui.so.4
#15 0x0000003348ff5b6a in QWidget::event(QEvent*) () from /usr/lib64/libQtGui.so.4
#16 0x0000003348faa9cc in QApplicationPrivate::notify_helper(QObject*, QEvent*) () from /usr/lib64/libQtGui.so.4
#17 0x0000003348fb115d in QApplication::notify(QObject*, QEvent*) () from /usr/lib64/libQtGui.so.4
#18 0x0000003349e06e86 in KApplication::notify(QObject*, QEvent*) () from /usr/lib64/libkdeui.so.5
#19 0x0000003347757cdc in QCoreApplication::notifyInternal(QObject*, QEvent*) () from /usr/lib64/libQtCore.so.4
#20 0x0000003348fb034e in QApplicationPrivate::sendMouseEvent(QWidget*, QMouseEvent*, QWidget*, QWidget*, QWidget**, QPointer<QWidget>&, bool) () from /usr/lib64/libQtGui.so.4
#21 0x00000033495578a6 in ?? () from /usr/lib64/libQtGui.so.4
#22 0x0000003349546044 in QGraphicsItem::sceneEvent(QEvent*) () from /usr/lib64/libQtGui.so.4
#23 0x000000334955ba18 in ?? () from /usr/lib64/libQtGui.so.4
#24 0x000000334955f935 in QGraphicsScene::mouseReleaseEvent(QGraphicsSceneMouseEvent*) () from /usr/lib64/libQtGui.so.4
#25 0x0000003349571b9f in QGraphicsScene::event(QEvent*) () from /usr/lib64/libQtGui.so.4
#26 0x0000003348faa9cc in QApplicationPrivate::notify_helper(QObject*, QEvent*) () from /usr/lib64/libQtGui.so.4
#27 0x0000003348fb098b in QApplication::notify(QObject*, QEvent*) () from /usr/lib64/libQtGui.so.4
#28 0x0000003349e06e86 in KApplication::notify(QObject*, QEvent*) () from /usr/lib64/libkdeui.so.5
#29 0x0000003347757cdc in QCoreApplication::notifyInternal(QObject*, QEvent*) () from /usr/lib64/libQtCore.so.4
#30 0x000000334958b0b5 in QGraphicsView::mouseReleaseEvent(QMouseEvent*) () from /usr/lib64/libQtGui.so.4
#31 0x0000003348ff5b6a in QWidget::event(QEvent*) () from /usr/lib64/libQtGui.so.4
#32 0x0000003349370e26 in QFrame::event(QEvent*) () from /usr/lib64/libQtGui.so.4
#33 0x00000033495894db in QGraphicsView::viewportEvent(QEvent*) () from /usr/lib64/libQtGui.so.4
#34 0x00000033477570f7 in QCoreApplicationPrivate::sendThroughObjectEventFilters(QObject*, QEvent*) () from /usr/lib64/libQtCore.so.4
#35 0x0000003348faa99c in QApplicationPrivate::notify_helper(QObject*, QEvent*) () from /usr/lib64/libQtGui.so.4
#36 0x0000003348fb115d in QApplication::notify(QObject*, QEvent*) () from /usr/lib64/libQtGui.so.4
#37 0x0000003349e06e86 in KApplication::notify(QObject*, QEvent*) () from /usr/lib64/libkdeui.so.5
#38 0x0000003347757cdc in QCoreApplication::notifyInternal(QObject*, QEvent*) () from /usr/lib64/libQtCore.so.4
#39 0x0000003348fb034e in QApplicationPrivate::sendMouseEvent(QWidget*, QMouseEvent*, QWidget*, QWidget*, QWidget**, QPointer<QWidget>&, bool) () from /usr/lib64/libQtGui.so.4
#40 0x0000003349022475 in ?? () from /usr/lib64/libQtGui.so.4
#41 0x0000003349020dec in QApplication::x11ProcessEvent(_XEvent*) () from /usr/lib64/libQtGui.so.4
#42 0x0000003349049dc2 in ?? () from /usr/lib64/libQtGui.so.4
#43 0x00000035cfa3bd02 in g_main_context_dispatch () from /lib64/libglib-2.0.so.0
#44 0x00000035cfa3fae8 in ?? () from /lib64/libglib-2.0.so.0
#45 0x00000035cfa3fc9c in g_main_context_iteration () from /lib64/libglib-2.0.so.0
#46 0x000000334777d603 in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib64/libQtCore.so.4
#47 0x0000003349049a8e in ?? () from /usr/lib64/libQtGui.so.4
#48 0x0000003347756722 in QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib64/libQtCore.so.4
#49 0x00000033477569ec in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib64/libQtCore.so.4
#50 0x0000003347758cd9 in QCoreApplication::exec() () from /usr/lib64/libQtCore.so.4
#51 0x00007f3ff864deb2 in kdemain () from /usr/lib64/libkdeinit4_plasma-desktop.so
#52 0x00000035ce21ec5d in __libc_start_main () from /lib64/libc.so.6
#53 0x0000000000400829 in _start ()

have you same issue?

Report

alex789

10 years ago

if json failed - just return raw text data, it is more usable than do nothing

Index: ktranslatoid.cpp
===================================================================
--- ktranslatoid.cpp (revision 1142885)
+++ ktranslatoid.cpp (working copy)
@@ -318,6 +318,7 @@

if (!ok) {
kDebug()<<"An error occured during parsing";
+ m_destText->setText(text);
return;
}

Report

matrs5

10 years ago

Hi
Suddenly translatoid stops to work . I enter a word, but isn't translated, independently of language. How can obtain some information about translatoid when is running? , normally I run a program from console and can obtain some information about possible errors. I have installed debug packages, but this error doesn't give a crash.

I use fedora 12 x64, kde 4.4.4 and translatoid 1.21 from fedora repo.

Ps: I use intensively this program,is very convenient and easy to use.I hope that you can help me

Report

hamelg

10 years ago

I'm using archlinux.
It stopped functioning when I upgraded to 1.21. 1.20 was working fine.

I see also this error when translatoid tries to translate :

json_parser - syntax error found, forcing abort

Report

matrs5

10 years ago

yep, I downgrade to version 1.0 and works, then I installed 1.2 and works too.

Report

matrs5

10 years ago

I launched plasma-desktop from console. It works fine,I running two plasma-desktop at the same time, but it maybe works for obtain information. When I use translatoid see this in the console:

kdeinit4: preparing to launch /usr/lib64/kde4/kio_http.so
json_parser - syntax error found, forcing abort

I didn't get a more detailed information :(

Report

alex789

10 years ago

also such problem:

json_parser - syntax error found, forcing abort

Report

9

fadnix

10 years ago

Same thing here it stopped working.
Fedora 13 (2.6.33.5-124.fc13.i686.PAE)
KDE 4.4.4
Translatoid 1.21

Report

3

chepioq

10 years ago

Same problem...
With Fedora13 and Fedora 14 rawhide...

Report

virgolus

10 years ago

same problem. Please fix the error, this is the most useful plasma widget. Bye

kubuntu 10.04
KDE 4.5 beta 2
Translatoid 1.21

Report

eliwap

10 years ago

The update seems to be working just fine. Thank you.

However, the file says that the version is 1.20 while the website logs fixes for version 1.2. Which is correct?

Thanks

Eli

Report

C

dridk

10 years ago

1.20

Report

eliwap

10 years ago

Thanks for that

Report

virgolus

10 years ago

The plasmoid work fine but it don't have a icon (see the image at http://imagebin.ca/view/ZDcg1GgA.html). In the .desktop file there is a reference to translatoid.png, but i don't find this in the directory "icons" of the plasmoid source. How can i fix this?
I have installed kde 4.4.1

Sorry for my english

Report

virgolus

10 years ago

Ok I fix my problem. I have copied the files into the dir "icons" into the respective directory on /usr/share/icons/hicolors/ZxY/apps/translator.png". Bye

Report

3

chepioq

10 years ago

I have just one question:
Can you translate translatoid in other language ?
For test I made a translatoid.pot and a fr.po, but I am not a programmer and I don't know how add this in your plasmoid...

Report

eliwap

10 years ago

Hi again

When I try to translate from English to Hebrew. The translated text, while it "writes" from right to left, it is aligned to the left side of the dialogue box with periods (ie ".") being formatted so that they appear at the beginning of the sentence rather than at the end.

If there is a way to correct this, it would be greatly appreaciated.

Report

3

chepioq

10 years ago

I test for you and I have an explanation.
Translatoid use google translator, and for test I do a translation English to Hebrew with this google translator.
Result are same as you see with Translatoid, so I think it is not a problem with this plasmoid but with google translator...

Report

9 years ago

-clear code
-add Catalan flag
-Add language title
- use Frame for the maintitle.
- Correct some encodage bug
- and more....

===0.4
- use kde svn :
http://websvn.kde.org/trunk/playground/base/plasma/applets/translatoid
- use PopupApplet! Now, Translatoid can be dock inside the main bar!
- Change language selection method! Now, You have to click and a KlistWidget appear !
- Add Copy and Past button
- Add AutoDetection language in languageList
- Add TooTip Message

Now, I need translator for translate, this translator... :)

===0.4.1
add Licence
add GPL2 header
replace setIcon() by nativeWidget()->seticon()

=====0.5
Add ListWidgetFlag inside the plasma and it appear with a Plasma::Animation!
Add Voice TTS support.

TODO : auto select - enter key - flag disabled for fedora!

======0.6
-AutoPaste the copy selection and autotranslate when you active Popup.
-GrabKeyboard when you active Popup
-Add "Clear Button"
-remove Cancel Button from DialogBox
-Add Po language file.
- Change inverse language icon
- Add Fedora Package without flags

====0.6.1
- Add new Icon
- change name : translatoid to plasma-applet-translatoid

======0.7
add New popup icon which can change his flags
use KConfigGroup for save favorite language
add FavoriteLanguage config dialog
some update of the code

=======0.8
IMPORTANT RELEASE :
change the algorithm of source translation. Now it use Post Method. It means that you can translate big text. And if you type 1 word, it get you the dictionnary result ! :) Thanks lexnewton.
=======0.9
-add new flags list ! Use a plasma::treeview with a QAbstractModel
-copy from the clipboard! Now, you just have to select a source text from anywhere, and active the popup, by cliking on the popup, or by a plasma shortcut.
-Change QTextEdit source event. Now, press Enter to translate, and press Shift+Enter to add a new line.

=======1.0
Change icon
Change a lot by aseigo , use KJob, nice animation during translate.
change the structure of translatoid
Will remove voice button, because KTTSD do the same job.
add estonishlanguage
===RC
After some error of myself! This is the good one :
- Set text color with theme color
- save your automaticaly last languages in use.

==1.1beta==== MAJOR CORRECTION
Now Translatoid use extender
Add Reminder extender to remind you some word after clicking on the star
Replace parsing by Json parsing. YOU NEED TO INSTALL libqjson
Clear some code and probably add some new bug.. :)
If you have some probs, contact me!

---1.1
Add new language :
"Afrikaans"
"Albanais"
"Albanais"
"Belarusian"
"Irish""Icelandic"
"Macedonian"
"Malaysia"
"Maltese"
"Persan"
"Swahili"
"Turkish"
"Yiddish"

1.12 ( Minor fix)
Just fix Icon installation...Sorry)
A new release will come out quickly

1.2 ( Minor fix)
Correct Html rending

1.21
Correct text color in "remind" area

1.30
Correct Json parser with new Google Api. Thanks alex789

1.30 bis
dominique fix

12345678910
15
product-maker janet Aug 22 2015 9 excellent
product-maker Zolnierzu May 26 2012 9 excellent
product-maker fadnix Apr 04 2011 9 excellent
product-maker infectedsoundsystem Jan 19 2011 9 excellent
product-maker chepioq Jan 05 2011 3 bad
product-maker vitoubien Nov 30 2010 9 excellent
Be the first to comment
janet
Aug 22 2015
Zolnierzu
May 26 2012
papylhomme
Apr 18 2011
cruzki
Feb 14 2011
tigerfoot
Dec 12 2010
max99
Dec 05 2010
Senth
Aug 15 2010
Refused
Jun 21 2010
Siminin
Jan 11 2010
fadnix
Dec 06 2009
Leiche
Nov 25 2009
montoya
Nov 21 2009
jajaX
Nov 19 2009
lordlukas
Nov 19 2009
perezmeyer
Sep 30 2009
M3t4linux
Aug 18 2009
EinfachToll
Jul 28 2009
dualpretop
Jul 14 2009
Podstavsky
Jun 10 2009
jzakrzewski
Apr 30 2009
dkarnout
Apr 25 2009
gimox
Apr 21 2009
universe777
Apr 18 2009
okias
Mar 25 2009
brdn25
Mar 16 2009
glad
Mar 09 2009
mbaszczewski
Feb 26 2009
dimitrispan88
Feb 12 2009
its
Feb 12 2009
ingame
Feb 07 2009
torkiano
Jan 31 2009
File (click to download) Version Description Downloads Date Filesize DL OCS-Install MD5SUM
*Needs pling-store or ocs-url to install things
Pling
0 Affiliates
Details
license
version
1.30
updated Nov 30 2010
added Jan 14 2009
downloads 24h
0
mediaviews 24h 0
pageviews 24h 1